文章目录
- 零、系列目录
- 一、背景
- 二、技术点
- 三、实现步骤
- 1、将文本分词
- 2、将分词结果向量化
- 3、计算两个向量的余弦相似度
- 四、核心代码
- 五、总结
零、系列目录
写这套文章的时候,不会完全按照目录的顺序一篇一篇写, 大家可以到目录中直接找到对应的章节进行查看。
点我跳转
一、背景
爬虫抓回来的文章很多,但有很多是重复或者类似的文章,可能就是某些自媒体的一篇稿件发在了多个平台,或者就是某个品牌方的新闻通稿。
针对这样的文章,我们增加了一个归集相同文章的功能。
具体的功能点实现可以以后再说,这里主要说说如何判断两篇文章(标题)是否相似。
二、技术点
判断两个句子(两段文本)相似度的方法有很多,这里使用其中比较简单的一种:余弦相似度
。
这里涉及到一些 NLP(自然语言处理)
相关的内容,但我们不需要了解理论细节,直接拿来用就行。
以下内容摘自 维基百科:
余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。这结果是与向量的长度无关的,仅仅与向量的指向方向相关。余弦相似度通常用于正空间,因此给出的值为0到1之间。
三、实现步骤
1、将文本分词
将文本分词有现成的工具,推荐几个大家自行选择:
- 结巴分词
号称「做最好的 Python 中文分词组件」,实际使用下来效果也不错,推荐。
- THULAC
由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。
- LTP 4
提供了一系列中文自然语言处理工具,用户可以使用这些工具对于中文文本进行分词、词性标注、句法分析等等工作。
2、将分词结果向量化
向量化,即计算了各个词的词频,做成一个矩阵(数组)。
3、计算两个向量的余弦相似度
直接使用 numpy
提供的函数来计算就可以。
dist = float(np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2)))
四、核心代码
代码地址:点击跳转
# -*- coding: utf-8 -*-
import jieba
import numpy as np
# 返回分词后的数组
def get_cut_words(t):
cuts = jieba.cut(t)
return list(cuts)
# 将两段文本向量化
def get_vectors(t1, t2):
# 分词
words1 = get_cut_words(t1)
words2 = get_cut_words(t2)
# 取去重后的所有词
words_all = list(set(words1 + words2))
len_all = len(words_all)
# 初始化向量(0矩阵)
v1 = np.zeros(len_all)
v2 = np.zeros(len_all)
# 计算词频(确定向量的每个位置的值)
for i in range(len_all):
word = words_all[i]
v1[i] = words1.count(word)
v2[i] = words2.count(word)
print("分词结果,句1:{}".format(words1))
print("分词结果,句2:{}".format(words2))
print("汇总去重结果:{}".format(words_all))
print("向量1:{}".format(v1))
print("向量2:{}".format(v2))
return v1, v2
# 计算两个向量的余弦相似度
def get_dist(v1, v2):
d = float(np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2)))
return d
if __name__ == '__main__':
title1 = "腾讯今天发布去年Q4财报"
title2 = "腾讯今天发布今年Q4财报"
vec1, vec2 = get_vectors(title1, title2)
dist = get_dist(vec1, vec2)
print("相似度:{}".format(dist))
运行结果:
Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/z9/dp914shj3xv_bjxwbz5v9p6w0000gn/T/jieba.cache
分词结果,句1:['腾讯', '今天', '发布', '去年', 'Q4', '财报']
分词结果,句2:['腾讯', '今天', '发布', '今年', 'Q4', '财报']
汇总去重结果:['Q4', '今天', '今年', '腾讯', '财报', '发布', '去年']
向量1:[1. 1. 0. 1. 1. 1. 1.]
向量2:[1. 1. 1. 1. 1. 1. 0.]
相似度:0.8333333333333335
Loading model cost 0.747 seconds.
Prefix dict has been built successfully.
五、总结
今天分享的相似文章分析,功能点比较明确,方法也比较简单,大多都是使用现成的工具,直接计算结果就可以。
其他关于 NLP
更深入的内容,咱们以后有机会再聊。
祝大家变的更强。