TF-IDF求取文本相似度

TF-IDF求取文本相似度

1.需求

有目标文本和许多的待检测文本,需要求得的是目标文本与其他文本的相似度。有停止词。

待检测文本如下:
在这里插入图片描述

目标文本:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gZv7PzXp-1620961082341)(C:\Users\123\AppData\Roaming\Typora\typora-user-images\1620359025659.png)]

要求取的是目标文本与待检测版本的相似度

2.TF-IDF算法求解相似度

#-*- encoding:utf-8 -*-
import jieba
from gensim import corpora, models, similarities
import heapq
import os
import json
import pandas as pd
import operator

class Qa:
    stopwords_file = 'stopwords.txt'
    stopWordsList = '停用词.txt'

    with open(r'实验室01项目.txt', 'r', encoding='utf-8') as file:

        content_list = file.readlines()  # 读取所有行并返回列表
    questionList = [x.strip() for x in content_list]
    print(questionList)

    # load stop_words
    def load_stop_words(self)->list:
        with open(self.stopwords_file, mode="r", encoding="utf-8") as f:
            content = f.read()
        content_list = content.split('\n')
        self.stopWordsList = content_list
        return self.stopWordsList

    #delete question list stopwords 删除词组列表中的停用词
    def delete_stop_words(self, wordsList:list) -> list:
        """
        :param wordsList: 列表
        :return: list
        """
        newWords = []
        for word in wordsList:
            if word not in self.stopWordsList:
                newWords.append(word)
        return newWords

    #question list
    def get_question_list(self):
        """
        可从数据库文本等 获取
        :return: list
        """
        questionList = self.questionList

        #将question list 分词并去除停用词
        result = [self.delete_stop_words(jieba.lcut(val)) for val in questionList]
        #print(result)
        return result

    #run
    def run(self, question: str) -> list:

        #1. 加载语料
        #load stop words
        self.load_stop_words()
        #get question list
        questionList = self.get_question_list()

        #delete stop words for input question
        question = self.delete_stop_words(wordsList=jieba.lcut(question))

        #2. 生成词典
        # 生成gensim 词典
        dictionary = corpora.Dictionary(questionList)
        print(dictionary)
        #3. 通过doc2bow 稀疏向量生成语料库
        corpus = [dictionary.doc2bow(item) for item in questionList]
        #4. 计算tf值
        tf = models.TfidfModel(corpus)
        # 5.通过token2id得到特征数(特征数:字典里面的键的个数)
        #dictionary.token2id: {'title': id}
        numFeatures = len(dictionary.token2id.keys())
        #计算稀疏矩阵相似度 建立索引
        index = similarities.MatrixSimilarity(tf[corpus], num_features=numFeatures)

        #生成新的稀疏向量  根据原有的dictionary 生成新的 稀疏向量
        newDec = dictionary.doc2bow(question)
        # result
        simsQuestion = index[tf[newDec]]

        #
        result = []
        #
        result1 = []
        for val in list(enumerate(simsQuestion)):
            if val[1] < 0.05:
                result1.append({
                    '项目': str(self.questionList[val[0]]),
                    '相似度': val[1],
                    '位置': val[0],
                })
        print(result1)
        file = open('data5.txt', 'w')
        file.write(str(result1));
        file.close()
        #
        for val in list(enumerate(simsQuestion)):
            if val[1] > 0:
                result.append({
                    '项目': str(self.questionList[val[0]]),
                    '相似度': val[1],
                    '位置': val[0],
                })
        print(result)
        file = open('data.txt', 'w')
        file.write(str(result));
        file.close()
        exit()

if __name__ == '__main__':
    Qa = Qa()
    text = open("实验室01研究方向和目标.txt", encoding="utf-8").read()
    Qa.run(text)

3.输出结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-77YiDFAm-1620961082344)(C:\Users\123\AppData\Roaming\Typora\typora-user-images\1620359154291.png)]

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TF-IDF结合余弦相似度是一种常用的文本相似度分析方法。TF-IDF是一种用于评估一个词语在文档中的重要程度的统计方法,它考虑了一个词语在文档中出现的频率以及在整个语料库中出现的频率。余弦相似度是一种用于计算两个向量之间的相似度的方法,它可以用于计算文本之间的相似度。将TF-IDF和余弦相似度结合起来,可以计算出两个文本之间的相似度,从而实现文本相似度分析。 ### 回答2: TF-IDF(term frequency-inverse document frequency)是一种常用的文本特征提取方法,被广泛用于文本数据挖掘和信息检索中。它的基本思想是将每个词汇在文本中的重要性权值化,从而实现文本相似度分析。 在TF-IDF中,文本中某个词汇的重要性被定义为该词汇在所有文档中出现的频率(即词频)与该词汇在当前文档中出现的频率的乘积的对数。TF-IDF的计算方式可以分为两个步骤:第一步是计算词频TF(term frequency),即某个词汇在当前文档中出现的次数除以该文档中所有词汇的总数。第二步是计算逆文档频率IDF(inverse document frequency),即所有文档数目除以包含该词汇的文档数的对数。最终的TF-IDF权值为TF和IDF的乘积。 余弦相似度是一种常用的衡量两个文本相似度的方法,其基本思想是将文本向量映射到一个n维空间中,然后计算两个文本向量在该空间中的夹角余弦值。余弦值越大,表示两个文本相似度越高。 把TF-IDF结合余弦相似度来做相似度分析,具体步骤如下: 1. 对于每个文本,利用TF-IDF方法计算每个词汇的权值。 2. 把文本中所有词汇的权值按照其在字典中的顺序排列,构成一个向量。 3. 对于两个文本,分别计算它们的TF-IDF向量。 4. 计算两个向量之间的夹角余弦值,它的值越接近1,表示两个向量越相似。 5. 如果需要对多个文本进行相似度分析,可以计算每个文本与其他文本相似度,然后根据相似度值进行排名。 TF-IDF结合余弦相似度相似度分析具有以下优点: 1. 通过对每个词汇的权值进行计算,可以准确地反映它在文本中的重要性。 2. 余弦相似度可以在一个高维向量空间中进行,可以避免维数灾难的问题。 3. 多个文本可以进行快速的比较和排序。 4. 可以应用于各种文本数据挖掘和信息检索任务,如推荐系统、文本分类和信息抽取等。 综上所述,TF-IDF结合余弦相似度是一种非常有效的文本相似度分析方法,可以广泛应用于各种文本数据挖掘和信息检索任务中。 ### 回答3: tf-idf结合余弦相似度是一种常用的文本相似度分析方法。它可以用于比较不同文本之间的相似性,以便确定它们是否具有相同的主题或意义。 tf-idf是一种文本特征提取技术,可以计算出某个词在文本中的重要程度。具体来说,tf-idf通过计算某个词在文本中的频率(tf)和在文集中的逆文档频率(idf)来确定其重要程度。逆文档频率表示某个词在文集中的普及程度,计算公式为:$idf(t)=log\frac{N}{df_t}$,其中N表示文集中文档的总数,$df_t$表示出现词t的文档数。 余弦相似度是一种衡量两个向量之间夹角的度量方法。在文本相似度分析中,可以将文本看作是向量,其中每个维度表示一个词的重要程度。通过计算两个文本向量的余弦相似度,可以得到它们之间的相似度。 将tf-idf和余弦相似度结合起来,可以实现文本相似度分析。具体来说,可以先将每个文本转换成一个向量,根据tf-idf计算出每个向量中每个词的重要程度,并根据余弦相似度计算出两个向量之间的相似度。通过比较所有文本之间的相似度,可以找到相似度较高的文本,进而确定它们之间是否具有相同的主题或意义。 总之,tf-idf结合余弦相似度是一种有效的文本相似度分析方法,可以帮助我们快速准确地比较不同文本之间的相似性。在信息检索、推荐系统、自然语言处理等领域都有广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值