相似度

自己实现文本相似度算法(余弦定理)

喜你入骨 提交于 2020-03-03 23:28:36
最近由于工作项目,需要判断两个txt文本是否相似,于是开始在网上找资料研究,因为在程序中会把文本转换成String再做比较,所以最开始找到了这篇关于 距离编辑算法 Blog写的非常好,受益匪浅。 于是我决定把它用到项目中,来判断两个文本的相似度。但后来实际操作发现有一些问题:直接说就是查询一本书中的相似章节花了我7、8分钟;这是我不能接受…… 于是停下来仔细分析发现,这种算法在此项目中不是特别适用,由于要判断一本书中是否有相同章节,所以每两个章节之间都要比较,若一本书书有x章的话,这里需对比x(x-1)/2次;而此算法采用矩阵的方式,计算两个字符串之间的变化步骤,会遍历两个文本中的每一个字符两两比较,可以推断出时间复杂度至少为 document1.length × document2.length ,我所比较的章节字数平均在几千~一万字;这样计算实在要了老命。 想到Lucene中的评分机制,也是算一个相似度的问题,不过它采用的是计算向量间的夹角(余弦公式),在google黑板报中的: 数学之美(余弦定理和新闻分类) 也有说明,可以通过余弦定理来判断相似度;于是决定自己动手试试。 首相选择向量的模型:在以字为向量还是以词为向量的问题上,纠结了一会;后来还是觉得用字,虽然词更为准确,但分词却需要增加额外的复杂度,并且此项目要求速度,准确率可以放低,于是还是选择字为向量。

使用 Levenshtein 寻找彼此相似的字符串对

不羁的心 提交于 2020-03-01 03:33:46
我们爬来了一些数据,接下来以豆瓣畅销书为例。 爬虫爬来的数据有 ['艾伦•图灵传','深入理解计算机系统(原书第2版)','C++ Primer 中文版(第 5 版)','深入理解计算机系统','Web性能权威指南'] 而我们系统中原有的数据有 ['艾伦·图灵传','深入理解计算机系统(原书第2版)','C++ Primer 中文版(第 4 版)','深入理解计算机系统'] 做前端的同志可能一眼就看出来了,两个数组中有三个元素是因为全半角的缘故,是不能全词匹配的,而前两本书事实上是同一本书。而《深入理解计算机系统》是可以全词匹配到的,《Web性能权威指南》一书是可以直接添加到数据库的。 解决方案一: 这个任务大可以交给编辑去做,但是时间复杂度为 N^2,连程序都吃不消跑,更别提让编辑做了。 解决方案二: 去除所有的标点符号,或者将所有全角符号转化为半角。 去掉所有空格。 然后进行全词匹配,这样做有些鲁莽,但是速度一点也不慢。 解决方案三: 我想到了用 jieba 进行中文分词, import jieba book = '艾伦·图灵传' word = jieba.cut(book) words = list(word) # words = ['艾伦', '·', '图灵', '传'] 对于每本书我们都可以进行这样一个分词操作,并可以考虑将标点符号去除。

利用word分词通过计算词的语境来获得相关词

北战南征 提交于 2019-11-27 14:25:02
我们如何通过计算词的 语境 来获得 相关词 呢? 语境 的定义是: 在一段文本中,任意一个词的语境由它的 前N个词和后N个词 组成。 相关词 的定义是: 如果两个词的语境越相似,那么这两个词就越相似,也就越相关。 算法由两个步骤组成: 1、从大规模语料库中计算每一个词的语境 ,并使用 词向量 来表示语境。 实现代码 2、把求两个词的相似度的问题 转换为 求这两个词的 语境 的 相似度 的问题。通过计算语境的相似度,就可得到词的相似度,越相似的词就越相关。 实现代码 关于相似度 计算,word分词还提供了很多种算法, 参考这里 使用方法如下: 1、使用 word分词 内置 语料库: 运行 word分词 项目根目录下的脚本 demo-word-vector-corpus.bat 或 demo-word-vector-corpus.sh 2、使用自己的文本内容: 运行 word分词 项目根目录下的 脚本 demo-word-vector-file.bat 或 demo-word-vector-file.sh 由于语料库很大,所以启动的时间会很长,请耐心等待,下面以例子来说明: 比如我们想分析 兰州 这个词的相关词有哪些,我们运行脚本 demo-word-vector-corpus.sh ,启动成功之后命令行提示: 开始初始化模型 模型初始化完成 可通过输入命令sa=cos来指定相似度算法