自然语言处理入门笔记-> 词性标注、命名实体识别

1,844 阅读3分钟

此文为学习何晗老师《自然语言处理入门》笔记

词性标注

  • 词性(Part-Of-Speech, POS):单词的语法分类。作用是提供词语的抽象表示。
  • 词性标注集:所有词性集合。

示例

词性 说明 中文示例 英文示例
r 代词 我 你 他 me you he
u 助词 的 了 得 地 着 oh well be
n 名词 太阳 月亮 南京 city house name
v 动词 跑 跳 走 run sit study
p 介词 被即 往 at on in before after
a 形容词 可爱 聪明 机灵 beautiful pretty good
nr 人名 马云 马化腾 James Kobe Bush
  • 词性标注:为句子中每个单词预测一个词性标签的任务。
  • 流水式词法分析器:在大型分词语料库上训练分词器,然后与小型词性标注语料库上的词性标注模型灵活组合

PKU格式标注:

咱们/r 中国/ns 这么/r 大/a 的/u 一个/m 多/a 民族/n 的/u 国家/n 如果/c 不/d 团结/a ,/w 就/d 不/d 可能/v 发展/v 经济/n ,/w 人民/n 生活/n 水平/n 也/d 就/d 不/d 可能/v 得到/v 改善/vn 和/c 提高/vn 。/w

基于感知机的词性标注

布什将出任美国总统
布什/nr 将/d 出任/v 美国/ns 总统/n
转移特征 状态特征 示例_{t=1} 示例_{t=2}
y_{t-1} x_{t-1} _B_1 -> 1
x_t 布什
x_{t+1}
x_t第一个字符
x_t长2的前缀
x_t长3的前缀
x_t最后一个字符
x_t长2的后缀
x_t长3的后缀

POSInstance特取特性

protected int[] extractFeature(String[] words, FeatureMap featureMap, int position) {
    List<Integer> featVec = new ArrayList<Integer>();
    // 前一个词
    String preWord = position >= 1 ? words[position - 1] : "_B_";
    // 当前词
    String curWord = words[position];
    // 下一个词
    String nextWord = position <= words.length - 2 ? words[position + 1] : "_E_";

    // 前一个词
    StringBuilder sbFeature = new StringBuilder();
    sbFeature.append(preWord).append('1');
    addFeatureThenClear(sbFeature, featVec, featureMap);
    // 当前词
    sbFeature.append(curWord).append('2');
    addFeatureThenClear(sbFeature, featVec, featureMap);
    // 下一个词
    sbFeature.append(nextWord).append('3');
    addFeatureThenClear(sbFeature, featVec, featureMap);
    
    int length = curWord.length();
    // 当前词的第一个字符,比如 ‘中华民族’ 第一个字符 ‘中’
    sbFeature.append(curWord.substring(0, 1)).append('4');
    addFeatureThenClear(sbFeature, featVec, featureMap);
    if (length > 1) {
        // 当前词的前两个字符,比如 ‘中华民族’ 第一个字符 ‘中华’
        sbFeature.append(curWord.substring(0, 2)).append('4');
        addFeatureThenClear(sbFeature, featVec, featureMap);
    }
    if (length > 2) {
        // 当前词的前三个字符,比如 ‘中华民族’ 第一个字符 ‘中华民’
        sbFeature.append(curWord.substring(0, 3)).append('4');
        addFeatureThenClear(sbFeature, featVec, featureMap);
    }

    // suffix(w0, i)(i = 1, 2, 3)
    // 当前词的最后一个字符,比如 ‘中华民族’ 最后字符 ‘族’
    sbFeature.append(curWord.charAt(length - 1)).append('5');
    addFeatureThenClear(sbFeature, featVec, featureMap);
    if (length > 1) {
        // 当前词的后缀两个字符,比如 ‘中华民族’ 长2后缀 ‘民族’
        sbFeature.append(curWord.substring(length - 2)).append('5');
        addFeatureThenClear(sbFeature, featVec, featureMap);
    }
    if (length > 2) {
        // 当前词的后缀三个字符,比如 ‘中华民族’ 第一个字符 ‘华民族’
        sbFeature.append(curWord.substring(length - 3)).append('5');
        addFeatureThenClear(sbFeature, featVec, featureMap);
    }

    return toFeatureArray(featVec);
}

命名实体识别

基于序列标注的命名实体识别

边界通过{B, M, E, S}确定,其类别可以通过B-nt等附加类别的标签来确定。 从通用语料库到序列标注命名实体识别语料库的转换,比如:

萨哈夫/nr 说/v ,/w 伊拉克/ns 将/d 同/p [联合国/nt 销毁/v 伊拉克/ns 大规模/b 杀伤性/n 武器/n 特别/a 委员会/n]/nt 继续/v 保持/v 合作/v 。/w
输入变量x_1 输入变量x_2 输出变量y
萨哈夫 nr S
v O
w O
伊拉克 ns S
d O
p O
联合国 nt B-nt
销毁 v M-nt
\vdots \vdots \vdots
委员会 n E-nt

特征提取

转移特征 词语特征 词性特征
y_{t-1} word_{t-2}
word_{t-1} tag_{t-1}
word_t tag_t
word_{t+1} tag_{t+1}
word_{t+2}