分享

自然语言处理入门:文本相似度计算算法介绍及实例代码

问题导读:
1、文本相似度计算的用途?
2、如何理解TF-IDF、LSI、LDA模型?
3、snownlp是什么?
4、如何使用snownlp?




一、文本相似度计算
文本相似度计算在信息检索、数据挖掘、机器翻译、文档复制检测等领域有着广泛的应用。文本相似度常用的计算方法有TF-IDF、LSI、LDA等。

1.TF-IDF模型
TF-IDF(Term Frequency-Inverse Document Frequency)是一种统计方法,用以评估某一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜寻引擎应用,作为文件与用户查询之间相关程度的度量或评级。

在一份给定的文件里,词频 (term frequency, TF) 指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化,以防止它偏向长的文件。逆向文件频率 (inverse document frequency, IDF) 是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

2.LSI模型
LSI(Latent Semantic Indexing)又称为潜在语义分析(LSA),是在信息检索领域提出来的一个概念。主要用于解决一词多义(如“bank”一词,可以指银行,也可以指河岸)和一义多词(如“car”和“automobile”具有相同的含义)。依靠余弦相似性的方法并不能很好地解决上述问题,所以提出了潜在语义索引的方法,利用SVD降维的方法将词项和文本映射到一个新的空间。

3.LDA模型
LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,也称为一个三层贝叶斯概率模型,包含词、主题和文档三层结构。所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到。文档到主题服从多项式分布,主题到词服从多项式分布。

LDA是一种非监督机器学习技术,可以用来识别大规模文档集(document collection)或语料库(corpus)中潜藏的主题信息。它采用了词袋(bag of words)的方法,这种方法将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息。但是词袋方法没有考虑词与词之间的顺序,这简化了问题的复杂性,同时也为模型的改进提供了契机。每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。

二、相似度计算库SnowNLP
SnowNLP是一个python写的类库,中文文本处理利器snownlp,可以方便的处理中文文本内容,文本相似度计算。还可以如中文分词、词性标注、情感分析、文本分类、提取文本关键词、等。

snownlp示例如下所示:
[mw_shl_code=python,true]# -*- coding: utf-8 -*-
"""
Created on Wed May 31 22:28:23 2017
@author: Administrator
"""
from snownlp import SnowNLP
s = SnowNLP(u'这个东西真心很赞')
s.words         # [u'这个', u'东西', u'真心',
                #  u'很', u'赞']
s.tags          # [(u'这个', u'r'), (u'东西', u'n'),
                #  (u'真心', u'd'), (u'很', u'd'),
                #  (u'赞', u'Vg')]
print(s.sentiments)    # 0.9769663402895832 positive的概率
#汉转拼音
print(s.pinyin)        # [u'zhe', u'ge', u'dong', u'xi',
                #  u'zhen', u'xin', u'hen', u'zan']
s = SnowNLP(u'「繁體字」「繁體中文」的叫法在臺灣亦很常見。')
#简转繁
print(s.han)    # u'「繁体字」「繁体中文」的叫法在台湾亦很常见。'

text = u'''
自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。
它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。
自然语言处理是一门融语言学、计算机科学、数学于一体的科学。
因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,
所以它与语言学的研究有着密切的联系,但又有重要的区别。
自然语言处理并不是一般地研究自然语言,
而在于研制能有效地实现自然语言通信的计算机系统,
特别是其中的软件系统。因而它是计算机科学的一部分。
'''
s = SnowNLP(text)
s.keywords(3)   # [u'语言', u'自然', u'计算机']
print(s.summary(3)) # [u'因而它是计算机科学的一部分',
                #  u'自然语言处理是一门融语言学、计算机科学、
                #    数学于一体的科学',
                #  u'自然语言处理是计算机科学领域与人工智能
                #    领域中的一个重要方向']
s.sentences
s = SnowNLP([[u'这篇', u'文章'],
             [u'那篇', u'论文'],
             [u'这个']])
print(s.tf)   #词频
print(s.idf)  #逆向文件频率
print(s.sim([u'文章']))# [0.3756070762985226, 0, 0][/mw_shl_code]

运行结果如下图所示:
20170531223614941.gif

来源:http://blog.csdn.net/flysky1991/article/details/72786820
作者:飞鸟2010

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条