简易版计算文本相似度

原创 2018年04月16日 09:18:30

我简单地计算《后宫甄嬛传》和《冷月如霜》的文本相似度,还有《后宫甄嬛传》和《寂寞空庭春欲晚》的文本相似度,并没有去掉标点符号,停用词等。

使用了TF-IDF,TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。这是百度查到的解释。另外,dictionary.doc2bow方法是把文档变成一个稀疏向量。稀疏向量既可以用Id+频数,也可以用indices和values表示。

最后的结果:


步骤:1、读取要计算的文档

2、进行分词

3、对文档进行整理成["词语","",......,""]

4、计算各个词的频率

5、对于数据量很大,过滤掉出现低频次的词

6、建立词典通过新的语料库

7、加载要进行对比的文档,重复2、3步

8、将要对比的文档转成稀疏向量

9、依据稀疏向量得到新的语料库

10、对新的语料库进行TFIDF模型的计算,得到TFIDF的值

11、依据语料库,特征数建立索引

12、依据索引得到最终的相似度

from gensim import corpora, models, similarities
import jieba
import urllib.request
from collections import defaultdict

doc1 = "D:/xx/xx/lengyueru.txt"
doc2 = "D:/xx/xx/jimochun.txt"
d1 = open(doc1,'r',encoding='utf-8').read()
d2 = open(doc2,'r',encoding='utf-8').read()

data1 = jieba.cut(d1)
data2 = jieba.cut(d2)


'''
for item in data1:
    print(item)
for item in data2:
    print(item)
'''

data11 = " "
for item in data1:
    data11 += item + " "
data21 = " "

for item in data2:
    data21 += item + " "
documents = [data11, data21]
texts = [[word for word in document.split()] for document in documents]
#split()默认以空格分开
#这个是循环嵌套,外层循环从右往左读,内层循环从后往前读,就是在遍历documents中,依次遍历document,得到的值赋给word
frequency = defaultdict(int)
#建立一个类似于字典的对象,其中values都是int,
for text in texts:
    for token in text:
        frequency[token] += 1
# 过滤掉出现低频次的词,数据量很大时
# texts=[[word for word in text if frequency[token]>3]for text in texts]
dictionary = corpora.Dictionary(texts)

#保存
#dictionary.save("D:/xx/xx/cidian.txt")
doc3 = "D:/xx/xx/hougongzhenhuan.txt"
d3 = open(doc3,'r',encoding='utf-8').read()

#进行分词整理成["","",......,""]
data3 = jieba.cut(d3)

data31 = " "


for item in data3:
    data31 += item + " "

newdoc = data31
newvec =dictionary.doc2bow(newdoc.split())
corpus = [
    dictionary.doc2bow(text) for text in texts]

#corpora.MmCorpus.serialize("D:/xx/xx/d3.mm",corpus)


tfidf =models.TfidfModel(corpus)
#得到特征数通过token2id
featurenum = len(dictionary.token2id.keys())
#依据语料库,特征数计算稀疏矩阵的相似度,从而建立索引
index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=featurenum)
sim = index[tfidf[newvec]]

print(sim)

网络工程师系统可靠性计算强化训练教程

-
  • 1970年01月01日 08:00

python数据分析与挖掘学习笔记(3)_小说文本数据挖掘part2

接上一节。 注:本文的所有路径都才用的是相对路径,读者请自行换成自己的绝对路径,保证文件可读取。 要进行文本挖掘,需要引入gensim这个工具包,需要用到其中的语料库,模型,相似度等包。 from g...
  • Ying_Xu
  • Ying_Xu
  • 2017-01-10 14:19:25
  • 1276

TOKEN+签名验证

TOKEN+签名验证 首先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候,会面...
  • xiong9999
  • xiong9999
  • 2017-02-22 15:42:15
  • 1027

python数据分析-文本相似度分析

由于本文设计较多知识点,在编写代码之前需要搞清楚这些知识点的含义。1。知识点解释 Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。...
  • wangxingfan316
  • wangxingfan316
  • 2018-03-03 10:29:42
  • 145

使用文本挖掘实现站点个性化推荐

作者:韦玮,重庆韬翔网络科技有限公司(上海)董事长兼总经理,IT作家,CSDN社区专家。  本文为韦玮原创文章,未经允许不得转载,点此查看作者有关《Python数据分析与挖掘经典案例实战》经验分享。...
  • yours0231
  • yours0231
  • 2016-12-16 10:30:50
  • 3699

Python文本相似度计算

主要步骤文本相似度计算主要用到gensim和jieba两个Python库,重要的是思想,要理解如何利用线性代数的知识解决相似度计算问题。 其主要步骤如下: * 读取文档 * 对要计算的多篇文档进...
  • zhoulizhu
  • zhoulizhu
  • 2017-12-29 17:08:11
  • 169

SSO单点登录使用token机制来验证用户的安全性

登录的业务逻辑 {     http:是短连接.           服务器如何判断当前用户是否登录?          // 1. 如果是即时通信类:长连接.     // 如何保证服...
  • a416090287
  • a416090287
  • 2016-09-19 19:29:58
  • 23791

python 使用gensim和pickle包,模拟智能客服系统

开发环境 mac + python3.6.3 思路讲解 现在一些智能客服系统,号称是机器人客服,其实也就是事先训练好了一些对话模型,从而看起来更精准智能,看着也高大上一些。其实可以分为三个...
  • a394268045
  • a394268045
  • 2018-02-01 09:29:40
  • 710

neutron-server的启动流程(二)

1.2 extension resource #/neutron/api/v2/router.py:APIRouter ext_mgr = extensions.PluginAwareExtensi...
  • gj19890923
  • gj19890923
  • 2016-05-08 15:00:13
  • 4652

【python】python自然语言处理-----计算中文文本相似度

python自然语言处理-----计算中文文本相似度 from gensim import corpora,models,similarities import jieba fro...
  • zkq_1986
  • zkq_1986
  • 2017-12-13 20:47:10
  • 265
收藏助手
不良信息举报
您举报文章:简易版计算文本相似度
举报原因:
原因补充:

(最多只允许输入30个字)