<commit_before>---
layout:     post
title:      "徒手撸个NLP分词器（4）"
date:       2017-10-06 00:00:00 +0800
author:     "DongYeo"
header-img: "img/post-bg-02.jpg"
tags: ["NLP"]
---

 你吃过猪肉，但你会做么？———尼古拉斯·造轮子·董

（注：本系列文章为 [《自然语言处理原理与技术实现》](https://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B01G8JOUSO/ref=sr_1_5?ie=UTF8&qid=1493475144&sr=8-5&keywords=%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86) 学习笔记，点击链接可购买，购买前请看评论哈~）

# 基于隐马尔科夫的词性标注

在完成分词以后，我们还需要标注出切分出来的各个词语的词性。我们可能会选出一个词语的词性最大可能性的词语，标注为该词语的词性，例如，改革这个词语，通常就会被标注为动词。

但是直接这么标注词语，显然不够准确，因为一个词语通常都有它的上下文，例如：推进改革，应该标注为名词，而改革技术会被标注为动词，这样的特征就叫做上下文特征。

词性标注有两种方法，一种是隐马尔科夫（Hidden Markov Model），一种是基于转换的学习方法，两个方法都考虑了频率和上下文两个要素。隐马尔科夫考虑了词性之间的转移概率和词性到词语的发射概率。


## 概率模型

假如给定词序列 W = w1w2w3...wi，目标词性序列 T= t1t2t3...ti，我们要使得 P(T\|W)的概率最大化。

使用贝叶斯公式，我们得出 P(T\|W) = P(T)\*P(W\|T)/P(W)，而P(W)可以忽略，于是，求目标概率的最大值就是求 P(T)\*P(W\|T)的最大值。

其中P(T) = P(t1t2t3...ti) = P(t1)P(t2\|t1)P(t3\|t1t2)...P(ti\|t1t2t3...ti-1),我们做独立性假设，使用2元模型做近似值，那么：

    P(T)≈P(t1)*P(t2|t1)....*P(ti|ti-1)

而P(W|T)我们假设每一个词性生成词语的概率之间是独立的，即：

    P(W|T)≈P(w1|t1)*P(w2|t2)...P(wi|ti)

我们得出最终的概率计算公式是：

    P(T|W)≈P(t1)*P(t2|t1)....*P(ti|ti-1)*P(w1|t1)*P(w2|t2)...P(wi|ti)

对于隐马尔科夫模型，w是已知的，我们称之为显状态，词性是未知的，我们支持位隐状态，隐状态到显状态的概率我们称之为发射概率，隐状态之间的概率我们称之为转移概率，一个显状态可能有多种隐状态。那么上述的公式就是每个显状态可能出现的隐状态序列的发射概率和转移概率的乘积。例如：我爱你 就是计算以下几种组合的概率最大值：

    P(我|rr)*P(n|rr)*P(爱|n)*P(rr|n)*P(你|rr)
    P(我|rr)*P(v|rr)*P(爱|v)*P(rr|v)*P(你|rr)

如图，展示了如何寻找这个最大概率，其中每个箭头代表词性(隐状态)之间的转移，而每个节点代表该词性发射到对应词语(显状态)，我们遍历每个显状态，计算遍历每个显状态的隐状态并计算上述的概率，采用动态规划找到每个隐状态的最佳前驱隐状态，直至结束，最终通过回溯找到最佳的词性标注序列。<commit_msg>nlp chapter4<commit_after>---
layout:     post
title:      "徒手撸个NLP分词器（4）"
date:       2017-10-06 00:00:00 +0800
author:     "DongYeo"
header-img: "img/post-bg-02.jpg"
tags: ["NLP"]
---

 你吃过猪肉，但你会做么？———尼古拉斯·造轮子·董

（注：本系列文章为 [《自然语言处理原理与技术实现》](https://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B01G8JOUSO/ref=sr_1_5?ie=UTF8&qid=1493475144&sr=8-5&keywords=%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86) 学习笔记，点击链接可购买，购买前请看评论哈~）

# 基于隐马尔科夫的词性标注

在完成分词以后，我们还需要标注出切分出来的各个词语的词性。我们可能会选出一个词语的词性最大可能性的词语，标注为该词语的词性，例如，改革这个词语，通常就会被标注为动词。

但是直接这么标注词语，显然不够准确，因为一个词语通常都有它的上下文，例如：推进改革，应该标注为名词，而改革技术会被标注为动词，这样的特征就叫做上下文特征。

词性标注有两种方法，一种是隐马尔科夫（Hidden Markov Model），一种是基于转换的学习方法，两个方法都考虑了频率和上下文两个要素。隐马尔科夫考虑了词性之间的转移概率和词性到词语的发射概率。


## 概率模型

假如给定词序列 W = w1w2w3...wi，目标词性序列 T= t1t2t3...ti，我们要使得 P(T\|W)的概率最大化。

使用贝叶斯公式，我们得出 P(T\|W) = P(T)\*P(W\|T)/P(W)，而P(W)可以忽略，于是，求目标概率的最大值就是求 P(T)\*P(W\|T)的最大值。

其中P(T) = P(t1t2t3...ti) = P(t1)P(t2\|t1)P(t3\|t1t2)...P(ti\|t1t2t3...ti-1),我们做独立性假设，使用2元模型做近似值，那么：

    P(T)≈P(t1)*P(t2|t1)....*P(ti|ti-1)

而P(W\|T)我们假设每一个词性生成词语的概率之间是独立的，即：

    P(W|T)≈P(w1|t1)*P(w2|t2)...P(wi|ti)

我们得出最终的概率计算公式是：

    P(T|W)≈P(t1)*P(t2|t1)....*P(ti|ti-1)*P(w1|t1)*P(w2|t2)...P(wi|ti)

对于隐马尔科夫模型，w是已知的，我们称之为显状态，词性是未知的，我们支持位隐状态，隐状态到显状态的概率我们称之为发射概率，隐状态之间的概率我们称之为转移概率，一个显状态可能有多种隐状态。那么上述的公式就是每个显状态可能出现的隐状态序列的发射概率和转移概率的乘积。例如：我爱你 就是计算以下几种组合的概率最大值：

    P(我|rr)*P(n|rr)*P(爱|n)*P(rr|n)*P(你|rr)
    P(我|rr)*P(v|rr)*P(爱|v)*P(rr|v)*P(你|rr)

如图，展示了如何寻找这个最大概率，其中每个箭头代表词性(隐状态)之间的转移，而每个节点代表该词性发射到对应词语(显状态)，我们遍历每个显状态，计算遍历每个显状态的隐状态并计算上述的概率，采用动态规划找到每个隐状态的最佳前驱隐状态，直至结束，最终通过回溯找到最佳的词性标注序列。
{'fraction_non_alphanumeric': 0.21771099744245526, 'fraction_numerical': 0.06489769820971868, 'mean_word_length': 7.715877437325905, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 2, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6068817', 'n_tokens_mistral': 2686, 'n_tokens_neox': 3099, 'n_words': 98}