基于TF-IDF算法、余弦相似度算法实现相似文本推荐——文本相似度算法,主要应用于文本聚类、相似文本推荐等场景。

设计说明

使用jieba切词,设置自定义字典

使用TF-IDF算法,找出文章的关键词;

每篇文章各取出若干个关键词(比如20个),合并成一个集合,计算每篇文章对于这个集合中的词的词频(待优化:为了避免文章长度的差异,可以使用相对词频,);

生成两篇文章各自的词频向量;

计算两个向量的余弦相似度,值越大就表示越相似。

实现说明

1)初始化

需要对原始文档做些简单的处理,在预处理结果文件中每一行记录一个文档,文档ID与文档内容通过一定分隔符分割(比如以:::间隔),写入txt文档,当然并非一定如此处理,此处可以根据实际使用,调整代码实现。

我选取了五则新闻,其中1,2,3为房地产板块新闻,4,5为NBA板块新闻。

原始文本预处理

其余初始化内容详见代码注释。

class DocumentSimilarity:

def __init__(self):

#停词字典路径

self.stopword = 'Cstopword.dic'

#原始文档路径,每一行一个文档,文档ID与文档内容以:::间隔

self.DocumentFilePath = 'Document.txt'

#切词结果存放路径

self.CutWordFilePath = 'CutWordNews.txt'

#每个文档选取关键词个数

self.KeyWordsNum = 10

#推荐相似文档个数

self.DocumentSimilarityNum = 6

#切词结果,格式为{文档ID:切词结果,……}

self.CutWordDict = {}

#文档关键词字典,格式为{文档ID:{关键词:TF-IDF值,……},……}

self.DocumentKeywords = {}

#文档词频字典,格式为{文档ID:{切词:词频,……},……}

self.WordsFrequency = {}

# 导入自定义字典

jieba.load_userdict("Custom_dictionary.dic")

2)使用jieba切词

之前在

Python 中文分词——jieba

文章中已详细介绍过,这里不做赘述。

def CutWord(self):

"""

切词

:return:

"""

stopwords = [line.strip().decode('utf-8') for line in open(self.stopword).readlines()] # 读取中文停用词表

with open(self.DocumentFilePath, 'r+') as readfile:

content = readfile.readlines() #读取文本内容

with open(self.CutWordFilePath, 'w+') as writerfile:

for line in content:

cut_words = jieba.cut(line.split(':::')[1]) #分词,默认是精确分词

tmp = []

for word in cut_words:

word = ''.join(re.findall(u'[\\u4e00-\\u9fa5]|[0-9]+', word)).strip() # 过滤不是中文、数字的内容

if (len(word) != 0 and not stopwords.__contains__(word)): # 去掉在停用词表中出现的内容

tmp.append(word)

writerfile.write('\t'.join(tmp).encode('utf-8') + "\n")

self.CutWordDict[line.split(':::')[0]] = '\t'.join(tmp).encode('utf-8')

结巴分词结果

3)使用TF-IDF算法,找出文章的关键词

TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字、词语的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。即如果某个词或短语在一篇文章中出现的频率(TF)高,并且在整个语料库章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合提取为文档关键字。

计算词频

词频 = 某个词在文章中出现的总次数/文章的总词数

计算逆文档频率

在此,首先需要一个语料库来模拟语言的使用环境。

逆文档频率(IDF) = log(词料库的文档总数/包含该词的文档数+1)

计算TF-IDF值

TF-IDF值 = TF * IDF(TF-IDF值与该词的出现频率成正比,与在整个语料库中的出现次数成反比)

排序取关键字

计算出文章中每个词的TF-IDF值之后,进行排序,选取其中值最高的几个作为关键字。

def GetKeyWords(self):

"""

获取文档关键词

:return:

"""

vectorizer = CountVectorizer() # 将文本中的词语转换为词频矩阵 矩阵元素a[i][j] 表示j词在i类文本下的词频 http://scikit-learn.org/stable/modules/feature_extraction.html

FrequencyMatrix = vectorizer.fit_transform(self.CutWordDict.values()) #返回词频矩阵

transformer = TfidfTransformer()

TFIDF = transformer.fit_transform(FrequencyMatrix) # 第一个fit_transform是计算tf-idf 第二个fit_transform是将文本转为词频矩阵,

AllWord = vectorizer.get_feature_names()

Weight = TFIDF.toarray() # tf-idf矩阵,元素w[i][j]表示j词在i类文本中的tf-idf权重

Title = self.CutWordDict.keys()

self.WordsFrequency = {}

for i in range(len(Weight)): #打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重

tmp ={}

for j in range(len(AllWord)):

if Weight[i][j] != 0.0:

tmp[AllWord[j]] = Weight[i][j]

sortdict = dict(sorted(tmp.items(), key=lambda d: d[1], reverse=True)[:self.KeyWordsNum])

self.DocumentKeywords[Title[i]] = sortdict #获取每篇文章的关键词

wordsFrequencyTmp = {}

for word in AllWord:

y = vectorizer.vocabulary_.get(word)

WordFrequency = FrequencyMatrix.toarray()[i][y]

if WordFrequency != 0:

wordsFrequencyTmp[word] = WordFrequency

self.WordsFrequency[Title[i]] = wordsFrequencyTmp

4)生成两篇文章各自的词频向量,计算两个向量的余弦相似度,值越大就表示越相似。

@staticmethod

def Cos(cipin):

"""

余弦计算,返回余弦相似度

:param cipin:词频,格式[[1,2],[1,2]]

:return:

"""

dot_product = 0.0

normA = 0.0

normB = 0.0

for x,y in cipin:

dot_product += float(x) * float(y)

normA += float(x) * float(x)

normB += float(y) * float(y)

if normA == 0.0 or normB == 0.0:

return 0

else:

return float(dot_product)/ float(sqrt(normA * normB))

def Cosinesimilarity(self,OneselfTextId):

"""

获取相似文档

:param OneselfTextId:文档ID

:return:

"""

SimilarText ={}

for TextId,Keywords in self.DocumentKeywords.iteritems():

if TextId != OneselfTextId:

Bothtextfrequency = []

K = self.DocumentKeywords[OneselfTextId].keys() + self.DocumentKeywords[TextId].keys()#获取双方关键词列表

for keyword in K :#获取关键词词频

if keyword in self.WordsFrequency[OneselfTextId].keys():

FrequencyOneself =self.WordsFrequency[OneselfTextId][keyword]

else:

FrequencyOneself = 0

if keyword in self.WordsFrequency[TextId].keys():

FrequencyOther =self.WordsFrequency[TextId][keyword]

else:

FrequencyOther = 0

Bothtextfrequency.append([FrequencyOneself,FrequencyOther])

Cosinesimilarity = DocumentSimilarity.Cos(Bothtextfrequency)#计算余弦

SimilarText[TextId] = Cosinesimilarity

SortDict = dict(sorted(SimilarText.items(), key=lambda d: d[1], reverse=True)[:self.DocumentSimilarityNum])

for i,n in sorted(SimilarText.items(), key=lambda d: d[1], reverse=True)[:self.DocumentSimilarityNum]:

print u'【文本ID】:{0},【文本相似度】:{1} 【文本关键词】:{2}|{3}'.format(i ,n,','.join(self.DocumentKeywords[i]),','.join(self.DocumentKeywords[OneselfTextId]))

return SortDict

使用说明

需安装jieba、sklearn、numpy第三方库。

import re

import jieba

import jieba.analyse

from sklearn.feature_extraction.text import TfidfTransformer

from sklearn.feature_extraction.text import CountVectorizer

from numpy import *

寻找与第一则新闻相似的文本内容结果如下:

if __name__ == "__main__":

DS = DocumentSimilarity()

DS.CutWord()

DS.GetKeyWords()

DS.Cosinesimilarity('1')

转载请说明,若对你有帮助,关注支持一下哦。

python中文相似度_基于TF-IDF、余弦相似度算法实现文本相似度算法的Python应用相关推荐

  1. python 文本相似度_【机器学习】使用gensim 的 doc2vec 实现文本相似度检测

    环境 Python3, gensim,jieba,numpy ,pandas 原理:文章转成向量,然后在计算两个向量的余弦值. Gensim gensim是一个python的自然语言处理库,能够将文档 ...

  2. python+tensorflow+captcha库:基于TF快速破解验证码

    python+tensorflow+captcha库:基于TF快速破解验证码 点击打开链接:文章摘自 https://blog.csdn.net/tengxing007/article/details ...

  3. sklearn tfidf求余弦相似度_【基础算法 】文本相似度计算

    在自然语言处理中,文本相似度是一种老生常谈而又应用广泛的基础算法模块,可用于地址标准化中计算与标准地址库中最相似的地址,也可用于问答系统中计算与用户输入问题最相近的问题及其答案,还可用于搜索中计算与输 ...

  4. 【基础算法 】文本相似度计算

    在自然语言处理中,文本相似度是一种老生常谈而又应用广泛的基础算法模块,可用于地址标准化中计算与标准地址库中最相似的地址,也可用于问答系统中计算与用户输入问题最相近的问题及其答案,还可用于搜索中计算与输 ...

  5. 使用余弦相似度算法计算文本相似度-数学

    20211201 也就是效果 皮尔逊>余弦>欧式 余弦相似度的局限 皮尔逊的优势,相当于是改进版余弦相似度 欧式与 余弦 欧式侧重于直线距离 归一化之后的欧式和余弦的效果也不同 比如 0, ...

  6. python中文聊天机器人_[源码和文档分享]基于python的中文聊天机器人

    前言 发布这篇 Chat 的初衷是想和各位一起分享一下动手来做聊天机器人的乐趣,因此本篇文章适合用于深度机器学习的研究和兴趣发展,因为从工业应用的角度来看使用百度.科大讯飞的 API 接口会更加的适合 ...

  7. python语法元素测试_基于python全局设置id 自动化测试元素定位过程解析

    背景: 在自动化化测试过程中,不方便准确获取页面的元素,或者在重构过程中方法修改造成元素层级改变,因此通过设置id准备定位. 一.python准备工作: 功能:用自动化的方式进行批量处理. 比如,你想 ...

  8. python知识点智能问答_基于检索的智能问答

    基于检索的智能问答.目前使用了简单词汇对比.词性权重.词向量3种相似度计算模式.输入符合格式的QA文本文件即可立刻使用. 程序版本和依赖库 使用 python3 运行 jieba 分词使用的库 gen ...

  9. python参数化建模加工图_基于Python的ABAQUS层压板参数化建模

    唐维 康泽毓 杨婷 曾凤 蒋莉 摘要:为了提高层压板在ABAQUS仿真中建模的效率与准确性,提出利用Python语言对ABAQUS二次开发进行层压板参数化建模的方法.基于ABAQUS有限元软件,采用P ...

最新文章

  1. 服务器技术综述(一)
  2. signature=60e238a971088f65081a607ed25e04b3,Healthcare Claims Loss Control Systems And Methods
  3. Java I/O系统学习系列一:File和RandomAccessFile
  4. 洛谷P5212:SubString(SAM、LCT)
  5. 数据之光 · 安全未来 | 第四届中国数据安全治理高峰论坛圆满召开!
  6. Qt文档阅读笔记-QSslConfiguration官方解析与实例
  7. Spring velocity 中文乱码 解决方案
  8. CSDN博客 不登录不能复制粘贴
  9. 如何将桌面上的计算机图表隐藏,怎么把电脑桌面隐藏图标弄出来怎么办
  10. 【千峰网安学习】利用PE破解系统密码
  11. 洛谷P1000 超级玛丽游戏c语言基础
  12. 怎样在微信、手机中浏览查看3D模型
  13. 荣耀20青春版装鸿蒙系统,华为鸿蒙2.0系统正式发布,只有这55款华为设备,可升级鸿蒙系统...
  14. 校验码 - 奇偶校验
  15. BUGKU--web详解
  16. 数通--交互技术--STP+RSTP详解
  17. 解决对路径bin\roslyn..的访问被拒绝
  18. 使用MDB查看变量的值
  19. html5 ios number,HTML5 Scorecard: The New iPad and iOS 5.1 — A Mixed Bag
  20. 运行unp书上第一个例子

热门文章

  1. p67对应的服务器芯片组,喜忧参半 Intel P67/H67芯片组全解析
  2. Iframe嵌套拒绝接入
  3. web系统大规模并发中的-秒杀与抢购
  4. 大学计算机手写图片,大学女教师坚持15年手写板书,绘图比电脑画的还好看
  5. Mesos已死,容器永生
  6. 国内所有的图床都在这了!!
  7. 利用腾讯云服务器搭建owncloud个人网盘
  8. 计算机毕业设计java+ssm智能点餐信息网站系统(源码+系统+mysql数据库+Lw文档)
  9. HTML马里奥小游戏
  10. IP-Guard移动智能终端安全审批使用详解