最近真的被这个搞得焦头烂额,从上个周末爬文本数据时开始,我每天对着电脑的时间几乎不低于10个小时,而且都在学一些从来没接触过的奇怪的东西,虽然感觉还不赖,但却总是踩坑。
我要先挂上今天发现的一篇参考文章,解决了我大部分疑惑:
所以我也follow这篇文章使用了jieba和gensim(其实我原本就使用的这个,不过看完了之后我放弃了tfidf,转而使用lsi和lda)
挂上这篇文章之后几乎已经不需要再写什么,所以就到此结束——
算了,还是写一点踩坑记录吧。
踩过的坑
如果你像我一样,在谷歌或者百度搜索“python 比较文本相似度”,可能会有大把大把的教程,但却几乎千篇一律,不知道是作者一稿多发还是被抄了个遍。这些教程大部分都是用TF-IDF算法来给文章的分词加权,但这里有个坑。
下面一段摘抄自维基百科
在一份给定的文件里,词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(term count)的归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。)对于在某一特定文件里的词语 来说,它的重要性可表示为:
以上式子中 是该词在文件 中的出现次数,而分母则是在文件 中所有字词的出现次数之和。
逆向文件频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到:
其中
- |D|:语料库中的文件总数
- :包含词语 的文件数目(即 的文件数目)如果词语不在数据中,就导致分母为零,因此一般情况下使用
然后
某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的tf-idf。因此,tf-idf倾向于过滤掉常见的词语,保留重要的词语。
TF-IDF
如果你仔细看的话,就会发现tf-idf需要多篇文章作为语料库,并不能两两比较文章的相似度(gensim看似不行,但是如果在作为语料库的列表后再接上一个空列表,就可以比较了,比如 [['你', '真', '好', '看'], []]
,但是两两比较的话结果和不用tf-idf是一样的。)
并且如果语料库里面的文章数不同,算出来的文章相似度也不同,和我的需求差的有点远。
内存爆炸
我一开始还以为是阿里云的 t5 实例太垃圾,运行不到十分钟就死机杀进程。后来不知怎的我突然意识到性能瓶颈是内存而不是cpu,监控了一下果然如此。4G的内存在5分钟内被直接塞满,然后死机,python进程被杀。
然后我就去搜索gensim占满内存的问题,接着我就看到了开头的那一篇文章。
原来gensim的官方文档也有讲到:
The
Similarity
class splits the index into several smaller sub-indexes (“shards”), which are disk-based. If your entire index fits in memory (~one million documents per 1GB of RAM), you can also use theMatrixSimilarity
orSparseMatrixSimilarity
classes directly. These are more simple but do not scale as well: they keep the entire index in RAM, no sharding. They also do not support adding new document to the index dynamically.
意思是如果你电脑的内存不够大的话,请不要直接用 MatrixSimilarity 和 SparseMatrixSimilarity 这两个方法,因为每百万个文档可能会占掉你的1G内存。不知道是不是因为我处理的是中文,我觉得占内存的情况比这个文档说的严重得多。
官方也提供了处理的方法,那就是使用 Similarity
index = Similarity(存储文件名, 语料库, num_features=len(词袋))
这样 index 就会被存在硬盘上,而不是一直挤爆内存
自我比较
生成了 index 之后,我按照网上的教程,使用 index[new_vector]
来检索新文章的相似度,但如果只是 index 内的文章相互比较的话,完全不用再处理,因为 index 里面本来就存着(我!靠!)
不信的话,直接
for similarities in index: print(similarities)
但是,不可以和列表一样索引。呵呵。
最后备份一下我的代码:
Comments | 2 条评论
博主 钱达
我看有的还用机器学习什么LDA
博主 傲娇的小基基
@钱达 其实我也不太了解,只是照猫画虎选了一种最简单的方法