【实战技能】自然语言处理(NLP)的案例二:语言建模和词性标注

自然语言处理,前面和大家说了

今天继续和大家聊聊我自己做的作业案例。作业来自Coursera上的Introduction to Natural Language Processing这门课,讲师是Dragomir R. Radev, Ph.D.,University of Michigan的教授。关于课程内容,虽然现在没有了,但是2016年的链接是https://www.coursera.org/learn/natural-language-processing/home/welcome

模型:HMM 隐式马尔科夫模型

这个案例我们会用到HMM (Hidden Markov Model,HMM) (隐式马尔科夫模型)

HMM的模型是一个五元组:

  • StatusSet: 状态值集合

  • ObservedSet: 观察值集合

  • TransProbMatrix: 转移概率矩阵

  • EmitProbMatrix: 发散概率矩阵

  • InitStatus: 初始状态分布

HMM模型用来解决以下三种问题:

  1. 在参数(StatusSet, TransProbMatrix, EmitRobMatrix,
    InitStatus)已知的情况下,求解观察值序列,这是Forward-backward算法。

  2. 在参数(ObservedSet, TransProbMatrix, EmitRobMatrix,
    InitStatus)已知的情况下,求解状态值序列,这是Viterbi算法, 可以用于中文分词、语音识别、新词发现和词性标注。

  3. 在参数(ObservedSet)已知的情况下,求解(TransProbMatrix, EmitRobMatrix,
    InitStatus),这是Baum-Welch算法。

语言建模

如何预测下一个词呢?这是语言建模的一个任务。我们使用Brown Corpus布朗语料库来创建、训练和评估语言模型。关于语料库,请查看此链接http://icame.uib.no/brown/bcm.html

我们使用Python最流行的NLP库自然语言工具包(NLTK)来完成语言模型的相关任务。

步骤如下:
1.计算Brown语料库未标注的训练集中的数据的一元,二元和三元对数概率。

2.使用模型来查找每个n元模型的布朗训练数据中每个句子的对数概率或得分。

如果发现任何n-gram不在训练句子里 ,将整个句子的log-probability设置为-1000。

3.在创建的三个n元模型中实现线性插值。

线性插值是一种旨在通过同时使用所有三个标注器,即一元、二元和三元语法标注器来导出更好的标注器的方法。 每个标注器被赋予由参数λ描述的权重。 有一些方法可以得出最好的一组λ,目前我们暂时设置所有三个λ相等。关于线性插值的具体内容,可以阅读Speech and Language Processing一书(http://web.stanford.edu/~jurafsky/slp3/)4.4.3节

词性标注

步骤如下

1.在已标记的数据集中分隔标记和单词。 在一个数据结构中存储没有标记的句子,而在另一个数据结构中存储这些标记, 确保将句子开始和停止符号添加到单词和标签的列表中。

2.计算标记的三元概率。

3.实现平滑方法。 使用标记“RARE”替换出现五次或少于五次的每个单词。创建在训练数据中出现超过五次的单词列表; 当标记时,不会出现在此列表中的任何单词应该被替换为标记“RARE”。

4.计算修改后的数据集的发散概率。

5.实现HMM (Hidden Markov Model,HMM) (隐式马尔科夫模型)标注器的Viterbi算法。Viterbi算法是一种具有许多应用的动态规划算法,也是用于找到给定句子的最高得分标签序列的相对有效的方法。关于算法的细节,可以阅读Speech and Language Processing一书(http://web.stanford.edu/~jurafsky/slp3/)第8.4和9.4节。

6.创建一个NLTK的三元标注器的实例,以回退到NLTK的二元标注器。 让二元标注器自己使用标记“NOUN”,以便回退到NLTK的默认标注器。

欢迎大家留言,和我一起交流自然语言处理。

上一篇:自定义继承


下一篇:山东大学人工智能专业NLP考试回忆版