自然语言处理中的常用术语、分词

在初步入门NLP过程中遇到很多摸不着头脑的英文术语,在这里做一个不完整的自我总结:

一、传统NLP快速回顾

在Natural Language Processing with PyTorch的第二个章节,作者对NLP中用到的一些术语做了简要介绍,包括Corpora(语料库)、Tokens(令牌)、Types(类型)、Ngram、subwords(子词)、词干和词根(stemmer、lemmas)。具体见如下链接:
Natural Language Processing with PyTorch(中文版)
除此之外补充几个术语:
Wordnet是一个词典。每个词语(word)可能有多个不同的语义,对应不同的sense。而每个不同的语义(sense)又可能对应多个词。
WordNet的使用方法

二、常用的中英文分词工具

博客介绍了几种常见的分词工具(中英文),NLP自然语言处理中英文分词工具集锦与基本使用

三、解决未登录词问题的方法

未登录词是指在验证集或测试集出现了训练集从来没见到过的单词。这种未登录词对分词,机器翻译性能影响很大。

1、简单粗暴的方法

在做nlp的时候,很多时候我们会对语料做一个预处理,生成语料的一个字典。为了不让字典太大,我们通常只会把出现频次大于某个阈值的词丢到字典里边,剩下所有的词都统一编码成#UNK 。

2、第一种方法的改进

由于第一种方法太过简单,在机器翻译领域,常见的方法有:给低频词再设置一个back-off 表呀,当出现低频词的时候就去查表。这种方法简单直接,若干back-off做的很好的话,对低频词的翻译会有很大的提升;但是这种方法依赖于back-off表的质量,而且也没法处理未登录词问题。还有一种方法是不做Word-Level的东西,转而做Char-Level的东西,也就是说既然以词为对象进行建模会有未登录词的问题,那么我们以单个字母或单个汉字(中文)为对象建模就可以解决问题,因为不管是什么词它肯定是由若干个字母或者汉字(中文)组成的。这种方法的确可以从源头解决未登录词的问题,但是这种模型粒度太细,一般出来的效果不是特别好。

3、基于Subword来生成词典的方法

因此在文章Neural Machine Translation of Rare Words with Subword Units中提出基于subword来生成词典的方法,核心思想是综合Word-Level和Char-Level的优势,从语料中学习到所有词里边频次高的字符串子串。然后把这些频次高的字符串子串收集起来形成一个字典,这个字典里边,既存在Word-Level级别的子串,也存在Char-Level级别的子串。然后把这个字典用于模型的训练。论文在寻找频次高的子串时,使用到了Byte Pair Encoding算法,只不过是把子串进行encoding而已。这个算法也很简单:每次合并在语料中同一个词里面、相邻的、出现频率最高的两个子串。decoding的时候,根据生成的词汇表做相应的替换。
常用的Subword分隔算法有BPE和ULM,都是用来处理传统词表示方法无法解决的罕见词和未登录词的问题,具体课件知乎文章:深入理解NLP Subword算法
基于Subword的字词切分算法主要有Sentencepiece、Subword-nmt、Wordpiece,具体不同可以见如下网址:
英文网址:Comparisons with other implementations
中文网址:ZHPMATRIX blog

你可能感兴趣的:(NLP)