本文以基本语言模型为逻辑主线,漫谈NLP中两个核心问题,即文本表示(Text Representation)与文本特征提取(Feature Engineering)。通过本文你会发现,NLP的一部分经典算法以及目前的发展都能够通过文本表示串联在一起,有个基本的结构脉络。当然,NLP大牛们正在不断地探索NLP更多的维度,本文只是一种切入的角度,也仅代表个人观点,如有任何错误还希望大牛们指教。

如果听过翟成祥老师《Text Mining and Analytics》的童鞋一定对图1有印象,人们对真实世界的感知被成为感知世界,而人们用语言表达出自己的感知视为文本数据。那么反过来,NLP,或者更精确地表达为文本挖掘,则是从文本数据出发,来尽可能复原人们的感知世界,从而服务于真实世界的过程。这里面就包括如图中所示的模型和算法,包括:
(1)文本层:NLP文本表示;
(2)文本-感知世界:词汇相关性分析、主题模型、意见情感分析等;
(3)文本-真实世界:基于文本的预测等。



图1:NLP与真实世界、感知世界、文本数据之间的关系

显而易见,文本表示在文本挖掘中有着绝对核心的地位,是其他所有模型建构的基础。因此,本文就以Language Model为核心,串联一些NLP当中的经典模型和算法,当然最终目的并非为搞清楚每个文本挖掘算法的理论推导应用blabla,而是为了理清文本挖掘的体系结构,最终服务于Real World实际应用中。



图2:NLP工程中技术框架——From阿里云栖社区

图2给出了讲NLP应用于实际工程场景中的结构,基础算法层面,主要将NLP按照算法对象分为词法分析、句法分析、语义分析和文档分析。显然这些都是NLP技术体系的重要组成部分,也是常规划分。而本文变换了视角,不从技术角度出发,而以应用为目的,来梳理文本挖掘的基础模型算法。

一、语言模型(Language Model, LM) - 我们的主线

A statistical language model is a probability distribution over sequences of words. Given such a sequence, say of length m, it assigns a probability to the whole sequence. Having a way to estimate the relative likelihood of different phrases is useful in many natural language processing applications, especially ones that generate text as an output. Language modeling is used in speech recognition, machine translation, part-of-speech tagging, parsing, handwriting recognition, information retrieval and other applications.
统计语言模型是词序列的概率分布,目的是建立一个能够描述给定词序列在语言中的出现的概率的分布。掌握不同句子/词组的概率估计方法在NLP中有很多应用,特别是用来生成文本。语言模型在语音识别、机器翻译、词性标注、句法分析、手写识别、信息检索都有广泛的应用。

  • 语言模型的基础模型为: P(w1w2...wT)=∏ni=1P(w1)P(w2|w1)P(wi|w1w2...wi−1) P(w_1w_2...w_T) = \prod_{i = 1}^n {P(w_1)P(w_2|w_1)P(w_i|w_1w_2...w_{i-1})} (公式1)
  • 目标函数(基于对数似然): L=∑w∈Clog(P(w|context(w)) L = \sum_{w \in C} {\log(P(w|context(w))} (公式2,其中C为语料,Context(w)为词w的上下文)
  • 对于语言里的每一个字符串 S 给出一个概率

二、语言模型的演化和相关模型算法的出现

为了让大家对后文有个初步的认识,在这一节中用概念图的形式整理了语言模型的演化历史和建构在每种语言模型上的各类算法。



图三:基于Language Model的NLP主要模型算法梳理

三、最基本的语言模型——词袋模型Bag of Word(BOW)及相关算法

词袋模型,顾名思义,把各种词放在一个文本的袋子里,即把文本看做是无序的词的组合。利用统计语言模型来理解,文本中每个词出现的概率仅与自身有关而无关于上下文。这是对公式1的最极端的简化。然而,很多常用的文本挖掘算法和文本统计特征都建构在此基础上。

1.TF、IDF等统计特征–>文本关键词提取

基于BOW的文本统计特征不胜枚举,这些特征在文本挖掘领域包括大家熟知的TF,IDF特征,也包括一些看似平凡琐碎实则在模型中权重很高的特征。在讨论TF-IDF特征前,先列举一些有关词频、词密度及可读性的统计特征。如:
(1)Count特征:词频统计、句频句长统计、标点统计以及一些领域相关词的统计等。
(2)可读性特征:音节数、烟雾指数和阅读舒适性等
该类特征可以利用github中的Textstat软件包进行分析。该软件提供了如下很多函数挖掘文本的统计学特征。

from textstat.textstat import textstat
if __name__ == '__main__':test_data = """Playing games has always been thought to be important to the development of well-balanced and creative children; however, what part, if any, they should play in the lives of adults has never been researched that deeply. """print textstat.flesch_reading_ease(test_data)print textstat.smog_index(test_data)print textstat.flesch_kincaid_grade(test_data)print textstat.coleman_liau_index(test_data)print textstat.automated_readability_index(test_data)print textstat.dale_chall_readability_score(test_data)print textstat.difficult_words(test_data)print textstat.linsear_write_formula(test_data)print textstat.gunning_fog(test_data)print textstat.text_standard(test_data)

回归正题,对于BOW模型来说,最经典的模型,没有之一,无异于TF-IDF(Term Frequency-Inverse Document Frequency)模型。该模型基于词频,将文本转换成向量,而不考虑词序。假设现在又N篇文档,在其中一篇文档D中,词汇w的TF、IDF、TF-IDF定义如下:

1.Term Frequency:词汇w在文档D中的频数
2.Inverse Document Frequency(IDF): log(总文档数N/包含词汇w的文档数Nw)
3.TF-IDF = TF*IDF,作为该词汇在该语料库中对于该文章的权重,写成公式如下:

wi,j=tfi,j∗log(N/dfi)

w_{i,j} = tf_{i,j} * \log(N/df_i)

sklearn中有TF-IDF模型的API,可将文本转换为权重向量,这既可以作为文本关键词提取的基本方法,也可以作为文本相似度度量的根据。例子如下:

In [1]: from sklearn.feature_extraction.text import TfidfVectorizerIn [2]: vec = TfidfVectorizer()In [3]: corpus = ['This is sample document.', 'another random document.', 'third sample document text']In [4]: X = vec.fit_transform(corpus)In [5]: print X   #(#doc, #wordFeature)   weight(0, 7)    0.58448290102(0, 2)    0.58448290102(0, 4)    0.444514311537(0, 1)    0.345205016865(1, 1)    0.385371627466(1, 0)    0.652490884513(1, 3)    0.652490884513(2, 4)    0.444514311537(2, 1)    0.345205016865(2, 6)    0.58448290102(2, 5)    0.58448290102In [6]: vec.get_feature_names()  #wordFeature Order
Out[6]:
[u'another',u'document',u'is',u'random',u'sample',u'text',u'third',u'this']

2.LSA潜在语义分析–文本稀疏表示–>文本相似度度量、主题模型

了解了TF-IDF模型,我们得到了文本的基本向量化表示,即得到了文本的(特征)向量,向量具有一定语义表达的能力。LSA正是在此基础上挖掘文本的潜在语义,建构主题模型等。
遍历语料库,得到全部文本-单词的权重矩阵,权重即上文所求TF-IDF值。建立文本-单词权重矩阵X后,可以通过SVD奇异值矩阵分解的方式将矩阵X转换为它的低秩逼近矩阵。可以去前k维作为主要特征,实现数据降维(原矩阵X维度为N*M,M为语料词汇总数)。推导过程见LDA_Wikipedia对SVD过程的详解。利用sklearn软件包中的降维模块,即可完成SVD过程。以上文中corpus = [‘This is sample document.’, ‘another random document.’, ‘third sample document text’]为例展示一下LSA过程的代码,如下:

In [17]: svd = TruncatedSVD(2)In [18]: norm = Normalizer(copy=False)In [19]: lsa = make_pipeline(svd, norm)In [20]: X = vec.fit_transform(corpus)In [21]: X = lsa.fit_transform(X)In [22]: print svd.explained_variance_ratio_.sum()
0.576009049909   # if svd = TruncatedSVd(3), sum=1.0In [23]: print svd.explained_variance_ratio_  #每个变量能够解释的信息量(Variance)占比
[ 0.02791594  0.54809311]In [24]: print X
[[ 0.93630095 -0.35119871][ 0.49995544  0.86605113][ 0.93630095 -0.35119871]]In [25]: print svd.components_  #每个新特征中,原词汇权重的系数
[[ 0.23229736  0.51070605  0.31620157  0.23229736  0.4809589   0.31620157    0.31620157  0.31620157][ 0.61930819  0.15015437 -0.18253737  0.61930819 -0.27764876 -0.18253737   -0.18253737 -0.18253737]

3.PLSA概率潜在语言分析



图四:PLSA Plate Notation

在LSA的基础上,Hofmann引入了概率模型,对LSA进行了丰富。PLSA的文本生成模型在图四。PLSA模型将这种文本-词语共现性(co-occurrence)关系看作一种条件独立多项式分布的混合 p(w,d)=∑cP(c)P(d|c)P(w|c)=P(d)∑cP(c|d)P(w|c) p(w,d) = \sum_{c}P(c)P(d|c)P(w|c) = P(d)\sum_{c}P(c|d)P(w|c)。其中, 条件概率p(c|d)及p(w|c)均为多项式分布。对于一篇文档d,我们先根据p(c|d)从隐含层C中选取d的类别(可以认为是d的主题),再根据p(w|c)的概率产生一个单词。这个是文档生成过程。模型中能够直观观察到文本和词汇的关系(w,d)。 我们需要顾及出p(c|d)和p(w|c)分布对应的多项式分布的参数,估计过程推导详见PLSA推导,里面有详细的PLSA中EM推导过程。

4.LDA隐含狄利克雷分布



图五:LDA Plate Notation

在PLSA基础上,Blei等为PLSA中的两个多项式分布引入了先验。而多项式分布的共轭分布为Dirchlet狄利克雷分布,这就是LDA中Dirchlet的由来。LDA生成模型为三层贝叶斯概率模型,包含词、主题(隐含)和文档三层结构。包含K个主题的文档D生成过程如下:

1.For 每个主题k, 利用超参数eta抽样beta_k~Dirichlet(eta), k=1...K
2.For 每篇文档d,利用超参数alpha抽样theta_d~Dirichlet(alpha), d=1...D
3.For 文档d中的单词i:a.从多项式分布theta_d中抽样得到单词i所属的主题z_di~Multinomial(theta(d))b.从多项式分布beta_(z_di)中抽样得到单词w_ij~Multinomial(beta_(z_di) )

我们常用Gibbs Samplig吉布斯采样的方案训练LDA模型。利用sklearn训练LDA主题模型的过程如下。

dataset = fetch_20newsgroups(shuffle=True, random_state=1,remove=('headers', 'footers', 'quotes'))#Use term count features for LDA
In [13]: tf_vectorizer = CountVectorizer(max_df=0.95, min_df=2,...:                                 max_features=n_features,...:                                 stop_words='english')In [14]: tf = tf_vectorizer.fit_transform(data_samples)In [15]: lda = LatentDirichletAllocation(n_topics=n_topics, max_iter=5,...:...:                                 learning_method='online',...:                                 learning_offset=50.,...:                                 random_state=0)In [16]: lda.fit(tf)
In [17]: #print trained topic model
In [18]: tf_feature_names = tf_vectorizer.get_feature_names()
In [19]: for idx, topic in enumerate(lda.components_):...:     print('Topic #%d' % idx)...:     print(" ".join([tf_feature_names[i] for i in topic.argsort ()[:-11:-1]]))   #打印(主题-词汇)向量Out[19]:
Topic #0
edu com mail send graphics ftp pub available contact university
Topic #1
don like just know think ve way use right good
Topic #2
christian think atheism faith pittsburgh new bible radio games alt
Topic #3
drive disk windows thanks use card drives hard version pc
Topic #4
hiv health aids disease april medical care research 1993 light
Topic #5
god people does just good don jesus say israel way
Topic #6
55 10 11 18 15 team game 19 period play
Topic #7
car year just cars new engine like bike good oil
Topic #8
people said did just didn know time like went think
Topic #9
key space law government public use encryption earth section securityIn [20]: lda.transform(tf)[0]  #打印(文章-主题)向量
Out[20]:
array([ 0.00344893,  0.6285982 ,  0.00344908,  0.00344877,  0.00344865,0.34381098,  0.00344842,  0.00344869,  0.00344944,  0.00344884])

Reference

  • LSA推导过程: https://en.wikipedia.org/wiki/Latent_semantic_analysis.
  • PLSA的提出: Hofmann, T. (1999). Probabilistic latent semantic analysis. UAI (Vol.41, pp.289-296).
  • 概率语言模型及其变形系列:http://blog.csdn.net/yangliuy/article/details/8330640
  • Sklearn LDA User Guide: http://scikit-learn.org/stable/modules/decomposition.html#latentdirichletallocation
  • Clustering Text Using K-Means: http://scikit-learn.org/stable/auto_examples/text/document_clustering.html#sphx-glr-auto-examples-text-document-clustering-py

以上是最基本的语言模型Bag-of-word以及在这个大背景下衍生出来的文本统计特征、语义特征等。在下一篇中,将继续了解更多的NLP语言模型,并了解在其背景下进行的延伸和探索。敬请期待。

NLP中的语言模型及文本特征提取算法相关推荐

  1. 四、NLP中的语言模型

    一.语料的获取与处理 1.什么是语料库? 语料:即语言材料.语料是语言学研究的内容.语料是构成语料库的基本单元. 语料库:存放的是在语言实际使用中真实出现过的语言材料,是以计算机为载体承载语言知识的基 ...

  2. NLP 中的语言模型预训练微调

    1 引言 语言模型(Language Model),语言模型简单来说就是一串词序列的概率分布.具体来说,语言模型的作用是为一个长度为m的文本确定一个概率分布P,表示这段文本存在的可能性.在实践中,如果 ...

  3. NLP中的语言模型(language model)

    什么是语言模型 本文参考维基百科语言模型 language model 统计语言模型是一个单词序列上的概率分布,对于一个给定长度为m的序列,它可以为整个序列产生一个概率 P(w_1,w_2,-,w_m ...

  4. 数据挖掘:网络挖掘技术——微博文本特征提取

    经典的向量空间模型(VSM: Vector Space Model)由Salton等人于60年代提出,并成功地应用于著名的SMART文本检索系统.VSM概念简单,把对文本内容的处理简化为向量空间中的向 ...

  5. 网络挖掘技术——微博文本特征提取

    文本特征向量 经典的向量空间模型(VSM: Vector Space Model)由Salton等人于60年代提出,并成功地应用于著名的SMART文本检索系统.VSM概念简单,把对文本内容的处理简化为 ...

  6. Princeton NLP Group姚顺雨博士:文本游戏中基于语言模型的动作生成

    ⬆⬆⬆              点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! "你在卧室,东边是一个走廊,西边有一个紧闭的木门,屋子中间有一个厚地毯,一个储物柜,你有一个 ...

  7. NLP中面向文本表示的模型梳理

    引言 语言表示是将自然语言表示为计算机或者模型能够处理的数据特征,是解决例如情感分析.命名实体识别.机器翻译.文本生成等这些高级任务的基础.本文作为NLP基础知识的入门,梳理了相关文本表征的模型与方法 ...

  8. NLP基础--文本特征提取中文分词word2vec原理

    文章目录 1. 文本特征提取 1.1 词集模型 1.2 BOW(Bag of Words)词袋模型 1.3 TF-IDF 2. 中文分词 2.1 基于词典匹配的分词方法 2.1.1 正向最大匹配(MM ...

  9. 从0到1,了解NLP中的文本相似度

    本文由云+社区发表 作者:netkiddy 导语 AI在2018年应该是互联网界最火的名词,没有之一.时间来到了9102年,也是项目相关,涉及到了一些AI写作相关的功能,为客户生成一些素材文章.但是, ...

最新文章

  1. 【ACM】连续出现的字符
  2. Android性能优化之启动优化实战篇,最新整理
  3. linux和android开发链接
  4. 安卓开发中SpannableString之富文本显示效果
  5. Java代码块的学习
  6. [React]你有用过哪些React的表单库吗?说说它们的优缺点
  7. 软件设计师c语言算法皇后,软件设计师历年试题-算法.ppt
  8. java ora 28040_Oracle 11g与112c中ORA-28040 错误解决
  9. 今天遇到了一个很坑爹的问题....
  10. 30 岁后,哪些职业瓶颈阻碍了你的成长?
  11. 全国计算机二级报名入口新疆,新疆2019年3月全国计算机等级(NCRE)考试(第54次)报名入口...
  12. python卷积函数_Convolution卷积算法python以numpy,Matplotlib实现
  13. 20170813xlVBA跨表筛选数据
  14. 装饰模式【设计模式学习-03】
  15. 从零开发区块链应用(一)--golang配置文件管理工具viper
  16. 弗雷歇距离 matlab,离散Fréchet(弗雷歇) 距离评价曲线相似度
  17. JAVA设计模式1 ---- 简单工厂模式 (以汽车工厂为例)
  18. 怎么检测硬盘是否有坏道
  19. eclipse开发桌面应用软件程序教程
  20. libuv访问mysql_浅析libuv源码-编译启动

热门文章

  1. namp 扫描器之王的基本使用
  2. Python之Bs4模块安装教程
  3. 【Springboot + Vue 视频播放web项目】解决视频播放只有声音没有画面
  4. ASP AND CLASS
  5. 无界文档| 我们尝试让文档变得更有格调一点!
  6. 网络爬虫之网页排重:语义指纹
  7. python unitest +parameterized 参数化【方法—】
  8. iptables(三)iptables命令详解
  9. 基础的java编程题_50道JAVA基础编程练习题
  10. Java遍历Json数据