当前位置:   article > 正文

NLP中的语言模型及文本特征提取算法_文本提词的相关性

文本提词的相关性

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

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


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

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


NLP工程中技术框架——From阿里云栖社区
图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)=i=1nP(w1)P(w2|w1)P(wi|w1w2...wi1) (公式1)
  • 目标函数(基于对数似然):L=wClog(P(w|context(w)) (公式2,其中C为语料,Context(w)为词w的上下文)
  • 对于语言里的每一个字符串 S 给出一个概率 (公式3)

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

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


这里写图片描述
图三:基于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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

回归正题,对于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,jlog(N/dfi)

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

In [1]: from sklearn.feature_extraction.text import TfidfVectorizer

In [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.58448290102

In [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']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
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.0

In [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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
3.PLSA概率潜在语言分析


图四:PLSA Plate Notation
图四: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(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
图五: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) )
  • 1
  • 2
  • 3
  • 4
  • 5

我们常用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 security

In [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])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

Reference

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/371958
推荐阅读
  

闽ICP备14008679号