自然语言处理,前面和大家说了
今天继续和大家聊聊我自己做的作业案例。作业来自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模型用来解决以下三种问题:
-
在参数(StatusSet, TransProbMatrix, EmitRobMatrix,
InitStatus)已知的情况下,求解观察值序列,这是Forward-backward算法。 -
在参数(ObservedSet, TransProbMatrix, EmitRobMatrix,
InitStatus)已知的情况下,求解状态值序列,这是Viterbi算法, 可以用于中文分词、语音识别、新词发现和词性标注。 -
在参数(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的默认标注器。
欢迎大家留言,和我一起交流自然语言处理。