# 注意:只是文本匹配而非语义匹配# 参考地址:https://zhuanlan.zhihu.com/p/43396514
#         https://www.geeksforgeeks.org/python-measure-similarity-between-two-sentences-using-cosine-similarity/
#
#         https://baike.baidu.com/item/%E4%BD%99%E5%BC%A6%E7%9B%B8%E4%BC%BC%E5%BA%A6/17509249
#         https://github.com/nltk/nltk
#         http://www.nltk.org/
#         https://github.com/fxsjy/jieba
# similarity = consine = (A.B) / (||A||.||B||) where A and B are vectors.(欧几里得点积公式)# pip install nltk
# import nltk
# nltk.download('all') ['punkt'|'stopwords'|...]  --all好像要下300M+数据
# nltk.tokenize: It is used for tokenization. Tokenization is the process by which big quantity of text is
#                divided into smaller parts called tokens. word_tokenize(X) split the given sentence X into
#                words and return list.# nltk.corpus: In this program, it is used to get a list of stopwords.
#              A stop word is a commonly used word (such as “the”, “a”, “an”, “in”).import jieba
import math
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenizedef check_zh_similarity(s1, s2):# 使用jieba分词并去掉stopwords,合并words,每个word都是一个维度sw = ['。', ',']s1_cut = [i for i in jieba.cut(s1, cut_all=True) if i not in sw]s2_cut = [i for i in jieba.cut(s2, cut_all=True) if i not in sw]word_set = set(s1_cut).union(set(s2_cut))print('cut s1: %s ' % s1_cut)print('cut s2: %s ' % s2_cut)print('word set: %s \n' % word_set)# 列出所有词 及 每个词在set中出现的位置(即每个单词所在的维度和该维度的编码)word_dict = dict()i = 0for word in word_set:word_dict[word] = ii += 1print('word dict: %s \n' % word_dict)# 统计s1各维度编码并计算每个维度的词频s1_cut_word_code = [word_dict[word] for word in s1_cut]print('s1 appear code: %s ' % s1_cut_word_code)s1_cut_word_fq = [0] * len(word_dict)for word in s1_cut:s1_cut_word_fq[word_dict[word]] += 1print('s1 word appear on each code: %s ' % s1_cut_word_fq)# 统计s2各维度编码并计算每个维度的词频s2_cut_word_code = [word_dict[word] for word in s2_cut]print('s2 appear code: %s ' % s2_cut_word_code)s2_cut_word_fq = [0] * len(word_dict)for word in s2_cut:s2_cut_word_fq[word_dict[word]] += 1print('s2 word appear on each code: %s \n' % s2_cut_word_fq)# 计算余弦相似度sigma_sum, sq1, sq2 = 0, 0, 0for i in range(len(word_dict)):sigma_sum += s1_cut_word_fq[i] * s2_cut_word_fq[i]sq1 += pow(s1_cut_word_fq[i], 2)sq2 += pow(s2_cut_word_fq[i], 2)try:cosine = round(float(sigma_sum) / (math.sqrt(sq1) * math.sqrt(sq2)), 6)except ZeroDivisionError:cosine = 0.0print('cosine similarity: %s \n\n' % cosine)def check_en_similarity1(s1, s2):# 使用nltk分词并去掉stopwords,合并words,每个word都是一个维度sw = stopwords.words('english')others = ['!', ',', '.', '?', '-s', '-ly', '</s>', 's']sw.extend(others)s1_cut = word_tokenize(s1)s2_cut = word_tokenize(s2)s1_cut = {w for w in s1_cut if not w.lower() in sw}s2_cut = {w for w in s2_cut if not w.lower() in sw}word_set = set(s1_cut).union(set(s2_cut))print('cut s1: %s ' % s1_cut)print('cut s2: %s ' % s2_cut)print('word set: %s \n' % word_set)# 列出所有词 及 每个词在set中出现的位置(即每个单词所在的维度和该维度的编码)word_dict = dict()i = 0for word in word_set:word_dict[word] = ii += 1print('word dict: %s \n' % word_dict)# 统计s1各维度编码并计算s1在每个维度的词频s1_cut_word_code = [word_dict[word] for word in s1_cut]print('s1 appear code: %s ' % s1_cut_word_code)s1_cut_word_fq = [0] * len(word_dict)for word in s1_cut:s1_cut_word_fq[word_dict[word]] += 1print('s1 word appear on each code: %s ' % s1_cut_word_fq)# 统计s2各维度编码并计算s2在每个维度的词频s2_cut_word_code = [word_dict[word] for word in s2_cut]print('s2 appear code: %s ' % s2_cut_word_code)s2_cut_word_fq = [0] * len(word_dict)for word in s2_cut:s2_cut_word_fq[word_dict[word]] += 1print('s2 word appear on each code: %s \n' % s2_cut_word_fq)# 计算余弦相似度sigma_sum, sq1, sq2 = 0, 0, 0for i in range(len(word_dict)):sigma_sum += s1_cut_word_fq[i] * s2_cut_word_fq[i]sq1 += pow(s1_cut_word_fq[i], 2)sq2 += pow(s2_cut_word_fq[i], 2)try:cosine = round(float(sigma_sum) / (math.sqrt(sq1) * math.sqrt(sq2)), 6)except ZeroDivisionError:cosine = 0.0print('cosine similarity: %s \n\n' % cosine)def check_en_similarity2(s1, s2):# tokenizationx_list = word_tokenize(s1)y_list = word_tokenize(s2)# sw contains the list of stopwordssw = stopwords.words('english')others = ['!', ',', '.', '?', '-s', '-ly', '</s>', 's']sw.extend(others)l1 = []l2 = []# remove stop words from the stringx_set = {w for w in x_list if not w.lower() in sw}y_set = {w for w in y_list if not w.lower() in sw}# form a set containing keywords of both stringsrvector = x_set.union(y_set)for w in rvector:if w in x_set:l1.append(1)  # create a vectorelse:l1.append(0)if w in y_set:l2.append(1)else:l2.append(0)# cosine formulac = 0for i in range(len(rvector)):c += l1[i] * l2[i]cosine = round(c / float((sum(l1) * sum(l2)) ** 0.5), 6)print("similarity: ", cosine)return cosineif __name__ == '__main__':# 中文句子测试# sentence1 = '这只皮靴号码大了。那只号码合适'# sentence2 = '这只皮靴号码不小,那只更合适'# check_zh_similarity(sentence1, sentence2)# 英文句子测试# sentence3 = 'How to create ticket in ticket system?'# sentence4 = 'How can I create ticket?'sentence3 = 'Do you know I love you?'sentence4 = 'I love you so much?'check_en_similarity1(sentence3, sentence4)check_en_similarity2(sentence3, sentence4)print('end!')

使用余弦相似度实现文本相似度检测相关推荐

  1. 使用余弦相似度计算文本相似度

    1. 使用simhash计算文本相似度 2. 使用余弦相似度计算文本相似度 3. 使用编辑距离计算文本相似度 4. jaccard系数计算文本相似度 2.向量余弦计算文本相似度 2.1 原理 余弦相似 ...

  2. python jieba 文本相似度_文本相似度分析(基于jieba和gensim)

    ##基础概念 本文在进行文本相似度分析过程分为以下几个部分进行, 文本分词 语料库制作 算法训练 结果预测 分析过程主要用两个包来实现jieba,gensim jieba:主要实现分词过程 gensi ...

  3. python中文相似度_python文本相似度计算

    步骤分词.去停用词 词袋模型向量化文本 TF-IDF模型向量化文本 LSI模型向量化文本 计算相似度 理论知识 两篇中文文本,如何计算相似度?相似度是数学上的概念,自然语言肯定无法完成,所有要把文本转 ...

  4. python词语匹配相似度_python文本相似度计算

    步骤分词.去停用词 词袋模型向量化文本 TF-IDF模型向量化文本 LSI模型向量化文本 计算相似度 理论知识 两篇中文文本,如何计算相似度?相似度是数学上的概念,自然语言肯定无法完成,所有要把文本转 ...

  5. java 文本的相似度_java – 文本相似度算法

    我正在做一个Java项目,我必须做一个文本相似程序.我想要采取2个文本文档,然后将它们相互比较并获得相似之处.他们是如何相似的. 我稍后会放一个已经有数据库的人可以找到这些单词的同义词,并通过文本来查 ...

  6. C# F23.StringSimilarity库 字符串重复度、文本相似度、防抄袭

    最近在我们的铺侦探(买铺租铺就上铺侦探)项目中,为了防止经纪人发布铺源的时候抄袭其他经纪人的铺源介绍,所以我们准备根据内容的相似度进行初步的防抄袭判断. 话不多说,懒得打字,下面直接上干货: 直接在V ...

  7. 从0到1,了解NLP中的文本相似度

    本文由云+社区发表 作者:netkiddy 导语 AI在2018年应该是互联网界最火的名词,没有之一.时间来到了9102年,也是项目相关,涉及到了一些AI写作相关的功能,为客户生成一些素材文章.但是, ...

  8. 从0到1,了解NLP中的文本相似度 1

    导语 AI在2018年应该是互联网界最火的名词,没有之一.时间来到了9102年,也是项目相关,涉及到了一些AI写作相关的功能,为客户生成一些素材文章.但是,AI并不一定最懂你,客户对于AI写出来的文章 ...

  9. 【论文】文本相似度计算方法综述

    概述 在信息爆炸时代,人们迫切希望从海量信息中获取与自身需要和兴趣吻合度高的内容,为了满足此需求,出现了多种技术,如:搜索引擎.推荐系统.问答系统.文档分类与聚类.文献查重等,而这些应用场景的关键技术 ...

最新文章

  1. tf2.0环境下“module ‘tensorflow‘ has no attribute ‘log‘”的解决办法
  2. python3菜鸟教程pdf-Python 3 教程
  3. OpenCV中CalonderDescriptorExtractor
  4. CSS一个冒号是伪类:用于监控动作、两个冒号是伪元素::用于定位元素
  5. android第三方应用,Android 第三方应用接入微信平台研究情况分享(一)
  6. mysql group函数_MySQL函数:group_concat()函数
  7. 云原生全景图之六 | 托管 Kubernetes 和 PaaS 解决什么问题
  8. C语言 函数缺省参数 - C语言零基础入门教程
  9. 搜素算法(基础)--DFS/BFS算法(JAVA)
  10. 【目标检测】NMS和soft-NMS详解及代码实现
  11. 视频版ImageNet?快手搞了一场用户兴趣建模大赛 | 附前三名干货
  12. 错误代码: 1005 Can't create table 'hibernate.bill' (errno: 150)
  13. 有道Java_有道词典java版下载-有道词典java豪华版v1.0.7 安卓版 - 极光下载站
  14. 软件安全(彭国军)期末复习
  15. 账号跟帐号、账户跟帐户的区别
  16. 傅立叶变换、Gabor变换与小波变换
  17. heroku搭建mysql_在heroku上部署Flask应用程序并将其连接到颚数据库mysql数据库
  18. 「今日 GitHub 趋势」让全世界程序员体会中国的 12306 抢票狂潮
  19. 页面滚动的时候自动切换导航栏
  20. [RK3288][Android6.0] 移植笔记 --- 固件无法下载到eMMC调试

热门文章

  1. STM32常用协议之SPI协议详解
  2. 杰里之AC696 列 系列 高关功放在软关机下的处理【篇】
  3. Debian 解决字体模糊问题
  4. SolidWorks 2018 初学基础到精通详细视频教程
  5. linux有不知名ip登录记录,通过登陆IP记录Linux所有用户登录所操作日志的方法
  6. 定位:relative相对定位、absolute绝对定位、fixed固定定位
  7. CSS定位position总结(超详细哦!)
  8. Python的文本数据提取extract()及正则表达式
  9. k8s etcd-2 Unhealthy HTTP probe failed with statuscode: 503
  10. (4)按键精灵常用语法-引流脚本混合式开发技术系列教程By飞云脚本学院