基础知识预备:
1.什么是空间向量:
空间中具有大小和方向的量叫做空间向量。向量的大小叫做向量的长度或模(modulus)
空间向量的坐标表示:A(x,y ,z)
2.空间向量的运算:
空间向量的坐标运算:设a=(x1,y1,z1),b=(x2,y2,z2)
|a|=
(根据勾股定理)
a+b=(x1+x2,y1+y2,z1+z2)
a-b=(x1-x2,y1-y2,z1-z2)
ka=k(x1,y1,z1)=(kx1,ky1,kz1)
a·b=x1x2+y1y2+z1z2
a∥b<=> a=kb(b≠0,
)
a⊥b<=> a·b=0<=>x1x2+y1y2+z1z2=0
3. TF-IDF算法--用于筛选关键词
TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF是词频(Term Frequency),IDF是逆文本频率指数(Inverse Document Frequency)。
TF表示词条在文档d中出现的频率。
当然,并不是说一个词出现的次数多,那么就可以使用这个词当做文章的关键词。比如说一篇文章中出现女性,果酸,激光的频率是一样的,但是明显果酸和激光的重要程度要大于女性,因为女性是一个很常见的词,所以我们就需要引入一个“权重的概念”来给特征词做一个排序。
IDF就是这个权重。
词频乘以权重,就是这个词的TF-IDF。TF-ID越大,那么表示这个词就很可能是文章的关键词。
简单来说,如果一个词很少见,但是在这篇文章里出现的频率很大,那么就可以算作是我们我们想要的关键词。
假如一篇文件的总词语数是100个,而词语“母牛”出现了3次,那么“母牛”一词在该文件中的词频就是3/100=0.03。一个计算文件频率 (IDF) 的方法是文件集里包含的文件总数除以测定有多少份文件出现过“母牛”一词。所以,如果“母牛”一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是 lg(10,000,000 / 1,000)=4。最后的TF-IDF的分数为0.03 * 4=0.12。
Gensim and scikit-learn已经实现了TFIDF算法,可以直接在python里调用,就能帮我们提取关键词。
4.余弦相似度
Cosine similarity is a measure of similarity between two vectors of an inner product space that measures the cosine of the angle between them. The cosine of 0° is 1, and it is less than 1 for any other angle.
简单来说,对于给定的词或者短语或者文章,计算转换成TF-IDF vectors,然后计算他们的夹角余弦值。
为什么余弦相似度可以用来判断文章相似度?
设想一下,二维平面的有两条有方向的线段,如果他们的夹角是0,那么意味着他们方向一致,重合,如果是90度,意味着他们的方向不一致;如果是180度,则意味着他们的方向相反。因此,我们可以通过向量的夹角,来判断向量的相似程度。使用余弦来表示就是,如果靠近1,就说明相似度大,如果靠近0,意味着相似度很小。
举个例子,判断以下两个句子的相似度?
a:我今天在食堂吃早饭
b:我今天也在食堂喝粥。
a 取关键词:我,今天,食堂,吃,早饭
b 取关键词:我,今天, 麦当劳,吃,早饭
我们的特征词就是 我,今天, 食堂,吃,早饭,喝粥。
分别给a和b两个句子,转换成相应的向量,向量纬数就是关键词的数量,各个维数的值是哥证词的频率。所以a的向量是{1,1,1,1,1,0},b的向量是{1,1,1,0,0,1}
(为什么拿到词频数之后,就需要转换成向量运算?比如我们如果需要比较两条线段,只需要一个纬度(长度),比较正方形,需要两个纬度,宽和高。同理,每个句子或者每篇文章都可以当作是关键词的组成。当我们拿到所有的特征词之后,就需要转换成统一的n纬向量进行比较。)
计算着两个6纬的空间向量的夹角的cos值(参考前面的公式)0.707
总结以下,计算两篇文章的相似度的思路是:
1。根据TF-IDF算法提取两片文章相同数量的特征词(比如每篇文章10个)
2。汇总提取出来的关键词,生成一个新的特征词集合(比如最终15个特征词)
3。根据第二步提取出来的特征词集合,分别计算两篇文章的特征值向量
4。计算两个向量的夹角的余弦值。