目录
一、文本生成任务
模型架构方面
训练数据方面
生成策略方面
二、命名实体识别任务NER
模型架构方面
特征工程方面
训练优化方面
三、情感分析任务
模型架构方面
训练数据方面
超参数调整方面
四、计算余弦相似度并添加符合条件结果
提示:
思路与算法
任由深渊的痛苦流过,我依旧是我
—— 25.4.8
一、文本生成任务
在自然语言处理的文本生成任务中,你使用基于Transformer的模型。模型生成的文本有时会出现逻辑跳跃、连贯性差的问题,并且在生成多样化内容时,难以平衡多样性与合理性。请从模型架构、训练数据和生成策略这三个方面分析可能的原因,并提出相应的改进措施。
模型架构方面
- 原因:
- 注意力机制局限:Transformer 的多头注意力机制虽能捕捉不同位置信息,但在处理长文本生成时,可能无法精准把握文本的全局逻辑关系。例如,在生成故事时,难以保证前后情节的连贯性,导致逻辑跳跃。而且,注意力机制在计算时对所有位置的关注相对均衡,没有突出关键信息的长期依赖关系,使得生成的文本在连贯性上表现不佳。
- 缺乏层次化结构建模:模型没有充分对文本的层次结构进行有效建模。文本通常具有句子、段落等不同层次,简单的 Transformer 架构难以区分不同层次信息的重要性。在生成过程中,不能合理地从不同层次组织信息,导致生成文本的结构不清晰,逻辑连贯性差。
- 位置编码不足:Transformer 的位置编码主要用于标识词在序列中的位置,但这种编码方式在反映文本的逻辑顺序和结构信息上存在局限性。特别是在生成多样化内容时,无法很好地引导模型按照合理的逻辑生成不同部分的文本,影响了文本的连贯性和多样性与合理性的平衡。
- 改进措施:
- 改进注意力机制:引入基于强化学习的注意力机制,通过奖励机制引导模型更关注与前文逻辑相关的信息。例如,对于生成连贯文本给予正向奖励,对于逻辑跳跃的情况给予惩罚,让模型学习如何更好地聚焦关键信息,提升文本连贯性。还可以采用基于位置的注意力机制,对不同位置的信息赋予不同的权重,突出关键位置的信息,增强长期依赖关系的捕捉能力。
- 构建层次化模型:在 Transformer 架构基础上,添加层次化编码模块。先对文本进行句子级别的编码,例如通过卷积神经网络(CNN)提取句子特征,再对这些句子特征进行段落级别的编码,如使用循环神经网络(RNN)处理。最后将层次化编码后的信息输入到 Transformer 解码器生成文本,使模型能更好地利用不同层次信息,生成结构清晰、逻辑连贯的文本。
- 优化位置编码:结合句法和语义信息改进位置编码。比如,利用依存句法分析获取词与词之间的结构关系,将这种结构信息融入位置编码中,让模型能更好地理解文本的逻辑顺序。或者根据文本的语义角色标注信息,调整位置编码,使模型在生成文本时能按照更合理的逻辑组织信息,平衡多样性与合理性。
训练数据方面
- 原因:
- 数据多样性不足:训练数据集中文本类型、主题和风格分布不均衡,模型对某些类型文本学习过度,对其他类型文本学习不足。例如,数据集中新闻类文本较多,而故事类文本较少,当生成故事时,模型可能因缺乏相关学习而出现逻辑跳跃、连贯性差的问题。同时,单一的数据类型也限制了模型生成多样化内容的能力,难以平衡多样性与合理性。
- 缺乏上下文信息:训练数据仅包含文本,没有提供足够的上下文信息,如文本的背景知识、主题相关信息等。在生成文本时,模型无法利用这些上下文信息来保持逻辑连贯,特别是在生成需要背景知识支撑的内容时,容易出现逻辑跳跃。而且,缺乏上下文信息也使得模型难以生成既多样又合理的内容。
- 标注不规范:如果训练数据是经过标注的,标注的不规范或不一致可能导致模型学习到错误的逻辑关系。例如,在文本摘要标注中,不同标注者对关键信息的理解和标注方式不同,会误导模型对文本逻辑和重要性的学习,从而在生成文本时出现逻辑问题。
- 改进措施:
- 扩充数据多样性:收集更多不同类型、主题和风格的文本数据,丰富训练数据的多样性。例如,除了常见的新闻、论文文本,还应包括故事、诗歌、对话等多种类型文本。对数据进行合理的预处理和清洗,确保数据质量。同时,采用数据增强技术,如对文本进行同义词替换、句子重组等操作,增加数据的多样性,使模型能更好地学习到不同类型文本的逻辑和表达方式,提升生成文本的连贯性和多样性。
- 添加上下文信息:在训练数据中加入文本的上下文信息,如通过知识图谱获取文本相关的背景知识,将这些信息与文本一起作为训练数据。模型在训练过程中可以学习利用这些上下文信息,生成逻辑连贯的文本。例如,在生成历史故事时,模型可以利用历史背景知识来保证情节的合理性和连贯性。此外,还可以在数据中添加文本的主题信息、情感倾向等,帮助模型生成既多样又合理的内容。
- 规范标注标准:制定详细明确的标注指南,对标注者进行培训,统一标注标准。采用多轮标注和交叉验证的方式,对标注结果进行审核和修正。可以利用自动评估指标(如 ROUGE 等)辅助标注过程,确保标注的准确性和一致性,让模型学习到准确的文本逻辑和重要性信息,从而生成逻辑连贯的文本。
生成策略方面
- 原因:
- 贪心搜索局限:如果采用贪心搜索策略生成文本,每次只选择概率最高的词,容易陷入局部最优解。这会导致生成的文本缺乏全局规划,出现逻辑跳跃,连贯性差。因为贪心搜索没有考虑后续词的选择对整体文本逻辑的影响,只关注当前步骤的最优选择,使得生成的文本在多样性和合理性之间难以平衡。
- 缺乏文本规划:生成策略没有对生成的文本进行有效的规划。在生成过程中,没有预先确定文本的大致结构和关键信息,只是逐词生成,导致生成的文本结构不清晰,逻辑连贯性差。同时,缺乏规划也使得模型难以生成多样化且合理的内容,因为没有从整体上把握文本的主题和发展方向。
- 未考虑语义连贯性:在生成过程中,没有充分考虑生成的词与前文的语义连贯性。生成的词可能在局部上概率较高,但与前文结合后语义不连贯,影响文本的整体质量。例如,生成的相邻句子之间缺乏逻辑联系,使得文本难以理解。
- 改进措施:
- 采用束搜索或其他优化策略:用束搜索代替贪心搜索,在每一步生成时保留多个概率较高的候选词(束宽决定候选词数量)。通过综合考虑后续生成步骤,从多个候选路径中选择最优文本,避免陷入局部最优,提高文本的连贯性和多样性与合理性的平衡。此外,还可以考虑使用强化学习等方法来优化生成策略,根据生成文本的质量反馈来调整生成过程,使生成的文本更符合要求。
- 引入文本规划机制:在生成文本之前,先对生成任务进行分析,确定文本的大致结构和关键信息。可以使用基于规则或机器学习的方法来进行规划,例如,通过对大量高质量文本的统计分析,学习不同类型文本的结构模式,然后应用到生成过程中。在生成时,按照预先规划的结构和关键信息框架,逐步填充内容,使生成的文本结构清晰、逻辑连贯。同时,通过规划可以更好地控制文本的多样性和合理性,例如,在规划中设定不同的情节发展方向来增加多样性,同时确保这些方向符合逻辑和主题要求。
- 增强语义连贯性:在生成过程中,利用语言模型的概率分布和语义理解能力,结合注意力机制,确保生成的词与前文在语义上连贯。例如,在计算生成下一个词的概率时,不仅考虑当前词的概率,还考虑该词与前文的语义相关性,通过调整概率分布来生成更连贯的文本。可以使用预训练的语言模型(如 GPT 系列)来评估生成文本的语义连贯性,并在生成过程中进行优化。
二、命名实体识别任务NER
在自然语言处理的命名实体识别(NER)任务中,你使用基于 Bi - LSTM + CRF 的模型。模型在识别一些模糊边界的实体和罕见实体时,准确率较低,并且对长文本的处理效果也不理想。请从模型架构、特征工程和训练优化这三个方面分析可能的原因,并提出相应的改进措施。
模型架构方面
- 原因:
- LSTM 自身局限:Bi - LSTM 虽然能够处理序列信息,捕捉前后文的依赖关系,但对于长文本,随着序列长度的增加,其梯度消失或梯度爆炸问题依然可能出现,导致难以有效学习长距离的依赖信息。在处理模糊边界实体和罕见实体时,由于缺乏长距离上下文信息的支持,无法准确识别。例如,在医学长文本中,疾病实体可能与前文的症状描述间隔较远,Bi - LSTM 难以建立有效的联系。
- 缺乏全局信息捕捉:Bi - LSTM 以词为单位依次处理序列,缺乏对整个句子或文本的全局理解。对于模糊边界实体,仅依靠局部的前后文信息难以准确判断边界位置。而对于罕见实体,由于在训练数据中出现频率低,仅从局部上下文难以学习到足够的特征,需要从全局文本中挖掘相关线索。
- CRF 局限性:条件随机场(CRF)在处理相邻标签之间的依赖关系上表现良好,但对于一些复杂的、非相邻词之间的语义关联捕捉能力有限。在识别模糊边界实体时,可能无法综合考虑非相邻词的信息来确定实体边界。对于罕见实体,由于其周围词的模式可能与常见实体不同,CRF 难以通过有限的训练数据学习到准确的标签依赖关系。
- 改进措施:
- 引入注意力机制:在 Bi - LSTM 层之后添加注意力机制,如自注意力机制(Self - Attention)。自注意力机制可以让模型在处理每个位置的词时,动态地关注文本中其他位置的信息,从而更好地捕捉长距离依赖关系,解决长文本处理问题。对于模糊边界和罕见实体,通过注意力机制可以从全局文本中聚焦到相关的重要信息,提高识别准确率。例如,在处理医学文本时,注意力机制可以帮助模型关注到相隔较远但与疾病实体相关的症状描述。
- 结合全局特征提取模块:在模型前端或后端添加能够提取全局特征的模块,如卷积神经网络(CNN)。CNN 可以通过卷积核在文本上滑动,提取不同尺度的全局特征。对于模糊边界实体,这些全局特征可以提供更丰富的信息来确定边界。对于罕见实体,全局特征有助于捕捉其在文本中的独特模式。例如,利用 CNN 提取句子的整体语义特征,与 Bi - LSTM 提取的序列特征相结合,提升模型对实体的识别能力。
- 改进 CRF 层:设计更复杂的 CRF 变体,例如基于神经网络的 CRF(Neural - CRF),通过神经网络来学习标签之间的依赖关系,增强对非相邻词之间语义关联的捕捉能力。这种方式可以更好地处理模糊边界实体和罕见实体周围复杂的语义关系,提高识别准确率。
特征工程方面
- 原因:
- 特征单一性:在命名实体识别中,仅使用词向量等简单特征可能无法充分表达文本中的语义信息。对于模糊边界实体,单一特征难以捕捉到其与周围词之间微妙的语义差异,导致边界判断不准确。对于罕见实体,由于其出现频率低,简单特征无法有效区分其与其他词的不同。例如,仅依靠词向量可能无法区分同形异义词在不同语境下是否为实体。
- 缺乏领域知识特征:在特定领域(如生物医学、法律等)的命名实体识别中,如果没有引入领域知识特征,模型很难识别出该领域的模糊边界实体和罕见实体。例如,在生物医学领域,基因名称的识别需要专业的生物学知识,如基因命名规则等,但普通的特征工程可能没有包含这些信息。
- 上下文特征挖掘不足:长文本中包含丰富的上下文信息,但现有的特征工程可能没有充分挖掘这些信息来帮助识别实体。对于模糊边界实体和罕见实体,上下文信息尤为重要,如前文的主题描述、后文的相关解释等,但未被有效利用,导致模型对这些实体的识别准确率低。
- 改进措施:
- 丰富特征表示:除词向量外,添加词性标注(POS)特征、命名实体类别标签特征等。词性标注可以提供词的语法信息,帮助模型更好地理解句子结构,从而更准确地识别实体。命名实体类别标签特征可以在训练过程中提供额外的监督信息,引导模型学习不同类别实体的特征。同时,结合预训练语言模型(如 BERT)的特征表示,这些模型在大规模语料上预训练,能够学习到丰富的语义知识,能更好地表示文本中的模糊边界实体和罕见实体。
- 融入领域知识特征:针对特定领域,收集和整理领域知识,如在生物医学领域,将基因命名规则、疾病分类体系等知识转化为特征。可以通过构建领域知识图谱,将图谱中的节点和关系信息融入到特征工程中。例如,将基因与相关疾病之间的关系作为特征,帮助模型识别基因实体。对于法律领域,可以将法律条文的结构和术语定义作为特征,提高对法律实体的识别能力。
- 增强上下文特征提取:利用句法分析和语义分析技术,提取文本中的依存关系、语义角色标注等上下文特征。依存关系可以揭示词与词之间的语法结构关系,语义角色标注可以明确每个词在句子中的语义角色,这些信息有助于模型理解上下文对实体的影响,特别是对于模糊边界实体和罕见实体。此外,通过窗口滑动的方式,提取词的局部上下文特征,如前后 n 个词的特征,增强模型对上下文信息的利用。
训练优化方面
- 原因:
- 数据不平衡:训练数据中不同类型实体的样本数量可能不平衡,常见实体的样本数量较多,而模糊边界实体和罕见实体的样本数量较少。模型在训练过程中倾向于学习多数类别的特征,对少数类别的模糊边界实体和罕见实体学习不足,导致识别准确率低。
- 过拟合问题:在处理长文本时,模型参数较多,如果训练数据量相对不足,容易出现过拟合现象。过拟合的模型在训练集上表现良好,但在测试集上对长文本中的模糊边界实体和罕见实体的泛化能力差,准确率下降。
- 优化算法选择不当:选择的优化算法可能不适合当前的命名实体识别任务和模型结构。一些优化算法在处理大规模数据或复杂模型时,收敛速度慢或者容易陷入局部最优解,影响模型的训练效果,导致对模糊边界实体和罕见实体的识别能力不佳。
- 改进措施:
- 平衡数据分布:采用过采样(如 SMOTE 算法)增加模糊边界实体和罕见实体样本的数量,或者对多数类样本进行欠采样,使各类别样本数量更均衡。还可以使用数据合成技术,生成与少数类样本相似的新样本,扩充模糊边界实体和罕见实体的数据量,让模型能够充分学习到各类实体的特征,提高识别准确率。例如,通过生成对抗网络(GAN)生成与罕见实体类似的文本片段作为训练数据。
- 防止过拟合:增加训练数据量,通过收集更多长文本数据或使用数据增强技术(如回译、同义词替换等)扩充数据集。同时,采用正则化技术,如 L1 和 L2 正则化,对模型参数进行约束,防止参数过大导致过拟合。还可以使用 Dropout 技术,在训练过程中随机丢弃部分神经元,减少神经元之间的共适应性,降低过拟合风险,提高模型对长文本中模糊边界实体和罕见实体的泛化能力。
- 优化算法调优:尝试不同的优化算法,如 Adam、Adagrad、Adadelta 等,并根据模型的训练效果调整算法的超参数(如学习率、动量等)。例如,对于复杂的模型结构和大规模数据,Adam 优化算法通常具有较好的收敛效果,可以通过实验确定其最优超参数设置,使模型能够更快地收敛到全局最优解,提升对模糊边界实体和罕见实体的识别能力。还可以采用学习率衰减策略,随着训练的进行逐渐降低学习率,避免模型在训练后期出现振荡,提高收敛效果。
三、情感分析任务
在自然语言处理的情感分析任务中,使用基于卷积神经网络(CNN)的模型。模型在处理含有隐喻、讽刺等复杂语言表达的文本时,情感判断准确率较低,并且在处理长文本时,性能下降明显。请从模型架构、训练数据和超参数调整三个方面分析可能的原因,并提出相应的改进措施。
模型架构方面
- 原因:
- 卷积核局限性:CNN 中固定大小的卷积核在捕捉隐喻、讽刺等复杂语言表达特征时存在困难。这些复杂表达往往需要对更广泛的上下文进行理解,而固定大小的卷积核感受野有限,难以捕捉长距离语义依赖,导致无法准确提取相关特征,影响情感判断。对于长文本,卷积核也难以覆盖所有关键信息,使得模型对长文本的整体理解能力不足,性能下降。
- 缺乏语义深度理解:单纯的 CNN 架构缺乏对语义的深度理解机制。隐喻、讽刺等表达需要对语言背后的隐含意义进行挖掘,CNN 通常只对局部文本模式进行卷积操作,难以深入理解文本的语义内涵,从而导致情感判断失误。
- 池化操作信息损失:常用的池化操作(如最大池化、平均池化)虽然能降低数据维度,但在处理含有复杂语言表达和长文本时,可能会丢失关键信息。对于隐喻、讽刺等依赖微妙语义线索的表达,池化操作可能会过滤掉重要的情感判断依据,对于长文本,也可能丢失长距离依赖信息,导致性能下降。
- 改进措施:
- 多尺度卷积核:采用不同大小的卷积核组合,小卷积核捕捉局部细节特征,大卷积核捕捉长距离语义依赖和更宏观的语义结构。例如,同时使用 3 - gram、5 - gram 和 7 - gram 的卷积核,从不同粒度提取文本特征,增强对复杂语言表达和长文本的理解能力。
- 结合循环神经网络(RNN)或 Transformer:将 CNN 与 RNN(如 LSTM、GRU)相结合,利用 RNN 的顺序处理能力和记忆机制来捕捉长距离依赖,帮助模型理解复杂语言表达和长文本中的语义关系。或者与 Transformer 结合,借助 Transformer 的自注意力机制对文本进行全局理解,提升对复杂语义的捕捉能力。
- 改进池化策略:使用基于注意力机制的池化方法,如自注意力池化。这种方法可以根据特征的重要性给予不同权重,避免重要信息丢失。模型可以自动关注与情感判断相关的关键信息,尤其是在处理复杂语言表达和长文本时,能更好地保留重要语义线索,提高情感判断准确率。
训练数据方面
- 原因:
- 数据多样性不足:训练数据集中包含隐喻、讽刺等复杂语言表达的样本较少,模型对这类表达的学习不够充分。当遇到含有复杂表达的测试文本时,由于缺乏相关经验,无法准确判断情感。对于长文本,数据集中长文本的比例和多样性也可能不足,模型对长文本的处理能力没有得到充分训练,导致性能下降。
- 标注不准确或不一致:对于含有复杂语言表达的文本,其情感标注可能存在主观性和不一致性。不同标注者对隐喻、讽刺等表达的理解和情感判断可能不同,这会误导模型学习,导致情感判断准确率降低。
- 缺乏上下文信息:训练数据通常只包含文本及其情感标签,缺乏相关的上下文信息。对于隐喻、讽刺等依赖上下文才能准确理解的表达,缺乏上下文信息会使模型难以把握其真实情感。长文本中的情感也往往与上下文紧密相关,缺乏上下文信息会影响模型对长文本情感的准确判断。
- 改进措施:
- 扩充数据多样性:收集更多含有隐喻、讽刺等复杂语言表达的文本数据,以及不同主题、长度的长文本数据。可以从文学作品、社交媒体评论、论坛帖子等多种来源获取数据,增加模型对复杂表达和长文本的学习机会。同时,利用数据增强技术,如回译、同义词替换等,对现有数据进行扩充,提高数据的多样性。
- 提高标注质量:制定详细的标注指南,对标注人员进行培训,确保标注的准确性和一致性。对于复杂语言表达的标注,可以采用多人标注并进行一致性检验的方式,选取最合理的标注结果。也可以利用自动标注工具辅助标注,但需要进行人工审核和修正,以提高标注质量。
- 添加上下文信息:在训练数据中尽可能添加上下文信息,如提供包含目标文本的段落或篇章。模型在训练时可以利用这些上下文更好地理解复杂语言表达和长文本中的情感。此外,还可以通过预处理步骤,提取与目标文本相关的关键上下文特征,如主题信息、情感倾向等,与文本一起输入模型,辅助模型进行更准确的情感判断。
超参数调整方面
- 原因:
- 卷积核数量与大小不当:卷积核数量过多可能导致模型过拟合,过少则可能无法充分提取特征,影响对复杂语言表达和长文本的处理能力。卷积核大小不合适,如过大或过小,都可能无法有效捕捉到相关语义特征,导致情感判断准确率下降。
- 学习率设置不合理:学习率过大,模型在训练过程中可能会跳过最优解,导致无法收敛,情感判断准确率不稳定。学习率过小,模型收敛速度慢,可能陷入局部最优解,同样影响性能,尤其是在处理复杂模型和大量数据时,不合适的学习率对模型效果影响更明显。
- 网络层数与神经元数量不合理:网络层数过多可能导致梯度消失或爆炸,使模型难以训练,对于复杂语言表达和长文本的处理能力也会受到影响。神经元数量过多或过少都会影响模型的表达能力,过多可能导致过拟合,过少则可能无法学习到足够的特征,从而降低情感判断准确率。
- 改进措施:
- 优化卷积核参数:通过交叉验证等方法,尝试不同数量和大小的卷积核组合,找到最适合当前情感分析任务的设置。例如,可以从较小的卷积核数量和大小开始尝试,逐渐增加,观察模型在验证集上的性能变化,选择能使模型在处理复杂语言表达和长文本时性能最佳的参数组合。
- 调整学习率:采用学习率衰减策略,在训练初期使用较大的学习率,使模型快速收敛到较优解附近,随着训练的进行,逐渐降低学习率,避免模型跳过最优解。也可以尝试不同的优化算法(如 Adam、Adagrad 等),每种算法对学习率的适应性不同,通过实验选择最适合的算法和学习率设置。
- 合理设置网络层数与神经元数量:根据数据集的规模和任务的复杂程度,合理调整网络层数和神经元数量。可以先参考相关文献或经验值进行初步设置,然后通过实验观察模型在训练集和验证集上的性能变化,逐步调整层数和神经元数量,以达到最佳的情感判断效果。例如,对于含有复杂语言表达和长文本的情感分析任务,可能需要适当增加网络层数和神经元数量来提高模型的表达能力,但要注意避免过拟合。
四、计算余弦相似度并添加符合条件结果
假设你正在处理自然语言处理中的文本匹配任务,给定两个句子列表
sentences1
和sentences2
,以及一个阈值threshold
。对于每对句子(s1, s2)
,其中s1
来自sentences1
,s2
来自sentences2
,计算它们之间的余弦相似度。如果余弦相似度大于等于threshold
,则将这对句子的索引对(i, j)
添加到结果列表中,其中i
是s1
在sentences1
中的索引,j
是s2
在sentences2
中的索引。请实现以下函数:
import numpy as np from sklearn.feature_extraction.text import TfidfVectorizer def find_matching_sentences(sentences1, sentences2, threshold): # 在此处编写你的代码 pass
提示:
- 可以使用
TfidfVectorizer
将句子转换为 TF - IDF 向量表示。- 计算两个向量之间的余弦相似度可以使用以下公式:
- 对于向量 a 和 b,余弦相似度:
- 在
numpy
中,可以通过np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
来计算。
思路与算法
① 合并句子并进行 TF - IDF 向量化
② 分割 TF - IDF 矩阵
③ 计算余弦相似度并筛选结果
④ 返回结果
TfidfVectorizer():将文本数据转换为 TF-IDF 特征矩阵,结合了 CountVectorizer
(词频统计)和 TfidfTransformer
(逆文档频率计算),适用于文本分类、信息检索等任务
参数名 | 类型/选项 | 必选 | 默认值 | 说明 |
---|---|---|---|---|
input | str ('content' , 'file' , 'filename' ) | 否 | 'content' | 输入类型:直接处理字符串、文件路径或文件对象。 |
analyzer | str ('word' , 'char' , 'char_wb' ) | 否 | 'word' | 分词粒度:按词、字符或词边界字符划分。 |
ngram_range | tuple (如 (1,2) ) | 否 | (1,1) | 提取 n-gram 范围,如 (1,2) 表示提取单字和双词组合。 |
max_df /min_df | float 或 int | 否 | 1.0 /1 | 忽略词频高于 max_df (或低于 min_df )的词,支持百分比(如 0.8 )或绝对频数(如 5 )。 |
stop_words | list 或 'english' | 否 | None | 停用词列表,设为 'english' 使用内置英文停用词。 |
norm | str ('l1' , 'l2' , None ) | 否 | 'l2' | 归一化方式:L1(曼哈顿范数)、L2(欧氏范数)或不做归一化。 |
use_idf | bool | 否 | True | 是否启用逆文档频率(IDF)计算,若设为 False ,仅使用词频(TF)。 |
fit_transform():先通过 fit()
学习数据的统计特征(如词频、IDF 值),再通过 transform()
应用变换生成 TF-IDF 矩阵,常用于训练数据预处理
参数名 | 类型 | 必选 | 默认值 | 说明 |
---|---|---|---|---|
X | Iterable (如文本列表) | 是 | - | 输入文本数据,需为可迭代对象(如列表或生成器)。 |
y | array-like | 否 | None | 通常不用于无监督任务(如 TF-IDF),在监督学习中可传递标签数据(如分类任务)。 |
np.linalg.norm():计算向量或矩阵的范数(如 L1、L2、无穷范数),支持按行或列计算,适用于数据归一化或相似度计算
参数名 | 类型/选项 | 必选 | 默认值 | 说明 |
---|---|---|---|---|
x | ndarray | 是 | - | 输入数组,支持任意维度。 |
ord | int /str (如 2 , 'fro' , np.inf ) | 否 | None (L2) | 范数类型:1 (L1)、2 (L2)、np.inf (无穷范数)、'fro' (矩阵 Frobenius 范数)。 |
axis | int (0 或 1 ) | 否 | None | 计算轴:0 按列计算,1 按行计算,None 计算整体范数。 |
keepdims | bool | 否 | False | 是否保持原数组维度(如 True 时,二维数组计算结果仍为二维)。 |
np.dot():计算两个数组的点积:
一维数组:向量内积(如 [1,2]·[3,4]=1 * 3 + 2 * 4=11
)。
二维数组:矩阵乘法(如 A@B
的等效操作)
参数名 | 类型 | 必选 | 默认值 | 说明 |
---|---|---|---|---|
a | ndarray | 是 | - | 左操作数数组,支持向量或矩阵。 |
b | ndarray | 是 | - | 右操作数数组,维度需与 a 兼容(如矩阵乘法要求 a.shape[1] == b.shape[0] )。 |
out | ndarray | 否 | None | 可选输出数组,用于存储结果(需预先分配内存)。 |
.toarray():将稀疏矩阵(如 scipy.sparse.csr_matrix
)转换为稠密 NumPy 数组,便于可视化或与其他库交互
列表.append():向列表末尾添加单个元素(若为可迭代对象,会作为整体添加),适用于动态构建列表
参数名 | 类型 | 必选 | 默认值 | 说明 |
---|---|---|---|---|
object | 任意类型 | 是 | - | 要添加的元素(如 list.append(5) 或 list.append([1,2]) ,后者会将 [1,2] 视为单个元素)。 |
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
def find_matching_sentences(sentences1, sentences2, threshold):
# 将两个句子列表合并,一起进行TF - IDF向量化
all_sentences = sentences1 + sentences2
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(all_sentences)
# 分割为两个句子列表对应的TF - IDF矩阵
num_sentences1 = len(sentences1)
tfidf_matrix1 = tfidf_matrix[:num_sentences1]
tfidf_matrix2 = tfidf_matrix[num_sentences1:]
result = []
for i in range(num_sentences1):
for j in range(len(sentences2)):
# 计算余弦相似度
similarity = np.dot(tfidf_matrix1[i].toarray()[0], tfidf_matrix2[j].toarray()[0]) / (
np.linalg.norm(tfidf_matrix1[i].toarray()[0]) * np.linalg.norm(tfidf_matrix2[j].toarray()[0]))
if similarity >= threshold:
result.append((i, j))
return result