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)=ni=1P(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)

回归正题,对于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']
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]
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) )

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

Reference

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

### 回答1: 替换相关词是指在文本预处理过程中,将一些相关的词汇替换成一个通用的词汇,以便在后续的分析和建模中能够更好地识别和处理这些词汇。例如,将“汽车”、“车辆”、“轿车”这些词汇替换成一个通用的词汇“车”。 文本特征处理是指在文本预处理过程中,对文本的特征进行处理和提取,以便在后续的分析和建模中能够更好地利用这些特征。例如,将文本转换成向量表示,使用词袋模型、TF-IDF等方法对文本特征进行提取。 这些预处理步骤的作用是可以提高机器学习模型的准确性和效率,使得模型更加容易识别和理解文本数据。 ### 回答2: 在文本预处理中,替换相关词指的是将文本中与特定主题或含义相关的词汇替换为统一的词语或词汇表。这样做的目的是为了减少词汇的多样性,减少相关词汇的干扰,提高文本处理的准确性和效率。例如,可以将"汽车"、"车辆"、"轿车"等词汇都替换为"汽车",以便在后续的文本分析中只需关注一个词汇。 文本特征处理是指对文本中的特征进行筛选、提取或转换的过程。通过对文本特征的处理,可以将原始的文本数据转化为机器可处理的特征表示,以便进行后续的机器学习或自然语言处理任务。常见的文本特征处理方法包括词袋模型、TF-IDF、Word2Vec等。例如,通过词袋模型将文本转化为向量表示,可以有效地捕捉文本中的关键词信息,进而用于分类、聚类等任务。 这两个方法在文本预处理中起到重要的作用。替换相关词能够简化文本信息,减少数据噪声,提高文本处理的精确度;而文本特征处理则能够将原始文本数据转化为机器可理解的特征表示,为后续的分析和建模提供有用的信息。这两个步骤的综合应用能够为文本数据的挖掘和应用奠定基础,提高文本处理的效果和效率。 ### 回答3: 在文本预处理中,替换相关词和文本特征处理是两个重要的步骤。 替换相关词指的是将文本中的某些词语或短语替换为其他词语或短语,以改变词语的表达方式或者使文本更加规范化。例如,将不同的大小写或者拼写变体替换为统一的形式,如将"USA"替换为"美国",将"I'm"替换为"I am"。这样做可以减少词汇表的大小,提高文本的可读性和统一性。 文本特征处理是对原始文本数据进行一系列的转换和加工,以便更好地利用这些数据进行后续的建模或分析。这些加工包括:分词,将文本拆分成单个的词语或短语;去除停用词,去除频率较高但没有实际含义的常见词汇,如"的"、"是"等;提取词干或词形还原,将不同的词形归并为同一词干或词根,如将"running"和"ran"都归并为"run";通过向量化将文本数据转换为向量形式,以便机器学习算法能够处理等。 替换相关词和文本特征处理在文本预处理中的作用是提高后续文本处理任务(如文本分类、情感分析等)的性能和效果。通过替换相关词可以减少词汇表大小,降低模型复杂度,提高模型的泛化能力;通过文本特征处理可以提取出更加有用的特征,减少无关特征的干扰,提高对文本数据的表达能力。这样可以大大提高模型的准确率和鲁棒性,增强对文本数据的理解和分析能力。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值