zoukankan      html  css  js  c++  java
  • python+jieba+tfidf算法 文本相似度

    jieba是python第三方库,用于自然语言处理,对文本进行分词,当然也有其他的分词库。

    gensim库,利用TFIDF算法来进行文本相似度计算,通过利用gensim库的corpora,models,similarities处理后续。


    • 基本思路:jieba进行分词,整理为指定格式->gensim库将要对比的文档通过doc2bow转化为稀疏向量->再通过models中的tf-idf将语料库进行处理->特征值和稀疏矩阵相似度建立索引->最后的到相似结果。

    接下来:

    我创建两个文本文件,作为语料库,另外再创建一个文本文件,作为需要对比的文件。内容是百度随便找的,就拿稀疏向量和稀疏矩阵的百度百科吧。分别(d1,d2)(d3)d3去对比d1,d2

    import jieba
    from gensim import corpora,models,similarities
    from collections import defaultdict   #用于创建一个空的字典,在后续统计词频可清理频率少的词语
    #1、读取文档
    doc1="./d1.txt"
    doc2="./d2.txt"
    d1=open(doc1,encoding='GBK').read()
    d2=open(doc2,encoding='GBK').read()
    #2、对要计算的文档进行分词
    data1=jieba.cut(d1)
    data2=jieba.cut(d2)
    #3、对分词完的数据进行整理为指定格式
    data11=""
    for i in data1:
        data11+=i+" "
    data21=""
    for i in data2:
        data21+=i+" "
    documents=[data11,data21]
    texts=[[word for word in document.split()] for document in documents]
    #4、 计算词语的频率
    frequency=defaultdict(int)
    for text in texts:
        for word in text:
            frequency[word]+=1
    '''
    #5、对频率低的词语进行过滤(可选)
    texts=[[word for word in text if frequency[word]>10] for text in texts]
    '''
    #6、通过语料库将文档的词语进行建立词典
    dictionary=corpora.Dictionary(texts)
    dictionary.save("./dict.txt")    #可以将生成的词典进行保存
    #7、加载要对比的文档
    doc3="./d3.txt"
    d3=open(doc3,encoding='GBK').read()
    data3=jieba.cut(d3)
    data31=""
    for i in data3:
        data31+=i+" "
    #8、将要对比的文档通过doc2bow转化为稀疏向量
    new_xs=dictionary.doc2bow(data31.split())
    #9、对语料库进一步处理,得到新语料库
    corpus=[dictionary.doc2bow(text)for text in texts]
    #10、将新语料库通过tf-idf model 进行处理,得到tfidf
    tfidf=models.TfidfModel(corpus)
    #11、通过token2id得到特征数
    featurenum=len(dictionary.token2id.keys())
    #12、稀疏矩阵相似度,从而建立索引
    index=similarities.SparseMatrixSimilarity(tfidf[corpus],num_features=featurenum)
    #13、得到最终相似结果
    sim=index[tfidf[new_xs]]
    print(sim)


    运行效果:(由于找的内容是同一个百度百科里的,可以看出来d3与d1,d2的相似度分别是16.6%和15.7%)

    从本次记录中可以思考一下,毕业论文查重或许也是类似原理,查重的语料库很巨大,将你的一篇论文与它众多论文进行对比,最后可以通过相关算法(也许就一个平均值)来计算最终相似度。所以可以思考思考如何应对。


  • 相关阅读:
    Potato工作流管理系统 组织模型用例描述
    6/27 项目编码开始:一个简单的员工管理程序
    6/16 6/17加班2天
    重新过一遍ASP.NET 2.0(C#)(8) DataSourceControl(数据源控件)
    可行性分析报告结构
    6/27 一个简单的员工管理程序:添加微软成员资格数据表
    在asp.net 2.0中使用母版页和工厂方法模式
    工作流功能特性
    6/21 系统分析阶段汇报
    什么是工作流
  • 原文地址:https://www.cnblogs.com/hecxx/p/11959852.html
Copyright © 2011-2022 走看看