「学习内容总结自 coursera 上的 Natural Language Processing 课程」
将输入文本拆分为有意义的块 (chunks) 的过程称为 Tokenization,并且这个被拆分出来的块实际上被称为令牌 (Token)。
下面来看一下简单的 WhitespaceTokenizer 的例子,它是将文本按照空白格划分的。在 NLTK 这个自然语言处理库里还有很多其他的 Tokenization 的方法,比如:TreeBanktokenizer 和 WordPunctTokenizer 等。
from nltk.tokenize import WhitespaceTokenizer
word_tokenizer = WhitespaceTokenizer()
word_list = word_tokenizer.tokenize("This is Andrew's text, isn't it?")
print(word_list)
?
['This', 'is', "Andrew's", 'text,', "isn't", 'it?']
我们可能需要同样的 Token 来表达不同形式的单词,比如 wolf 和 wolves ,一个是单数形式,一个是多数形式,但它们的意思是一样的。所以就将其统一表达为 wolf 。
wolf , wolve ——> wolf
talk , talks ——> talk
标准化的过程可以称为 Stemming (词干来源)或者 Lemmatization (词形还原)。
Stemming
词干来源 Stemming 是一个删除和替换后缀以获得词根形式的过程。它通常指的是试图将后缀截断或替换它们。
Lemmatization
词形还原时,通常会使用词汇表和形态分析来正确地处理。结果会返回一个单词的基本或字典形式,这就是所谓的 lemma。
首先计算一个特定 token 出现的频率。我们实际上要寻找像 "excellent" 和 "disappointed" 这样的标记语言,并鉴别这些单词,且以特定单词的存在与否来做决定。下面以一部电影的三个评论 good movie,not a good movie ,did not like来举个例子。 提取文本中所有的单词或者 token ,对于每个这样的单词或者 token,引入一个与该特定单词对应的新特征。因此,这是一个非常庞大的数字指标,以及我们如何将文本转换为该指标中的行或者向量。具体做法如下图所示,对于 good movie 而言,good 和 movie 都出现在我们的文本中,所以均标记为 1 ;not, a, did, like 这四个单词均没出现,所以标记为 0 。下面not a good movie 和 did not like 以此过程类推。这个过程为称为文本向量化 (Text vectorization) ,因为我们实际上用一个巨大的数字向量替换文本,并且将该向量的每个维度对应于我们数据库中的某个 token。
但是这个方法会存在一些问题:
解决 BOW 方法的缺陷:
保护一些秩序的方法:提取 n-grams,即提取一些 token 对,三元组或者其他不同的组合。其中1-grams 表示 tokens ;2-grams 表示 token pairs;.... 其他的以此类推。虽然 n-grams 能够解决失序的问题,但同时又会产生另外一个问题--特征的数量会变得庞大。为了避免特征数量变得巨大,可以移除一些高频和低频的 n-grams 。
通过频率的方法我们可以滤出一些坏的 n-grams ,但是将频率用于对中频 n-grams (我们真正需要的 n-grams)排名会怎么样呢?其实可以看出频率越低将会越容易被鉴别,因为在文本中其能够捕获一些特殊的信息。透过这个想法可以提出下面的 TF (Term Frequency,词频) 的概念。
沿用上面词频的想法,下面将介绍关于词频的一些概念。
首先要知道词频 TF (Term Frequency) 的概念:
接着介绍逆文本频率 IDF (Inverse Document Frequency) 的概念:
一般正常情况是将包含词 t 的文件的数量除以语料库中所有的文本的数量,以此得到文档频率。而逆文档频率是取其倒数,再取 log 值。
最后将上面两者结合得到 TF-IDF 概念:
有了 n-grams 和 TF-IDF 的概念就可以改进 BOW 的缺陷。主要是下面两个方面: