「学习内容总结自 coursera 上的 Natural Language Processing 课程」
文本处理
Tokenization 令牌化
将输入文本拆分为有意义的块 (chunks) 的过程称为 Tokenization,并且这个被拆分出来的块实际上被称为令牌 (Token)。
- 可以认为在语义处理过程中一个 Token 就是一个有用的单元
- 可以划分为一个单词 (word),一个句子 (sentence),一个段落 (paragrapgh) 等等
下面来看一下简单的 WhitespaceTokenizer 的例子,它是将文本按照空白格划分的。在 NLTK 这个自然语言处理库里还有很多其他的 Tokenization 的方法,比如:TreeBanktokenizer 和 WordPunctTokenizer 等。
代码语言:javascript复制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 Normalization 令牌标准化
我们可能需要同样的 Token 来表达不同形式的单词,比如 wolf 和 wolves ,一个是单数形式,一个是多数形式,但它们的意思是一样的。所以就将其统一表达为 wolf 。
代码语言:javascript复制wolf , wolve ——> wolf
talk , talks ——> talk
标准化的过程可以称为 Stemming (词干来源)或者 Lemmatization (词形还原)。
Stemming
- A process of removing and replacing suffixes to get to the root form of the word, which is called the stem.
- It usually refers to heuristic that chop off suffixes or replaces them.
词干来源 Stemming 是一个删除和替换后缀以获得词根形式的过程。它通常指的是试图将后缀截断或替换它们。
Lemmatization
- Usually refer to doing things properly with the use of vocabularies and morphological analysis.
- Returns the base or dictionary form of a word, which is known as the lemma.
词形还原时,通常会使用词汇表和形态分析来正确地处理。结果会返回一个单词的基本或字典形式,这就是所谓的 lemma。
Token 转换为特征
Bag of Words (BOW)
首先计算一个特定 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。
但是这个方法会存在一些问题:
- 失去的单词顺序。因为我们实际上是对单词进行随机排放,而正确的表示将保持不变。这就是为什么它被称为 bag of words,因为它是一个没有序列的包,单词可以按任何顺序出现。
- 计数器没有标准化。
解决 BOW 方法的缺陷:
保护一些秩序的方法:提取 n-grams,即提取一些 token 对,三元组或者其他不同的组合。其中1-grams 表示 tokens ;2-grams 表示 token pairs;.... 其他的以此类推。虽然 n-grams 能够解决失序的问题,但同时又会产生另外一个问题--特征的数量会变得庞大。为了避免特征数量变得巨大,可以移除一些高频和低频的 n-grams 。
- 高频 n-grams : - 名词,介词等(例如:a,the,and),这些被称为停用词的词汇,它们不会帮助我们区分文本,我们可以很容易地删除它们。
- 低频 n-grams: - 拼写错误,稀少的 n-grams ,我们不需要这些词汇,因为它们会造成过拟合。
通过频率的方法我们可以滤出一些坏的 n-grams ,但是将频率用于对中频 n-grams (我们真正需要的 n-grams)排名会怎么样呢?其实可以看出频率越低将会越容易被鉴别,因为在文本中其能够捕获一些特殊的信息。透过这个想法可以提出下面的 TF (Term Frequency,词频) 的概念。
TF-IDF 词频-逆文档频率
沿用上面词频的想法,下面将介绍关于词频的一些概念。
首先要知道词频 TF (Term Frequency) 的概念:
- 用 tf(t,d) 表示词(或者 n-grams) t 在文本 d 中的频率。
- 多种表现形式:
接着介绍逆文本频率 IDF (Inverse Document Frequency) 的概念:
- N = |D| -- 用大写 N 表示语料库中所有文本的数量,用大写 D 表示语料库。
- | {d ∈ D:t ∈ d }| -- 表示包含词 t 的文件的数量。
- idf(t,D) = log(N / | {d ∈ D:t ∈ d }|)
一般正常情况是将包含词 t 的文件的数量除以语料库中所有的文本的数量,以此得到文档频率。而逆文档频率是取其倒数,再取 log 值。
最后将上面两者结合得到 TF-IDF 概念:
- tfidf(t,d,D) = tf(t,d) * idf(t,D),通常将词频与逆文档频率相乘得到 TF-IDF 的值。
- TF-IDF 的主要思想是:如果某个词在一篇文档中出现的频率高,即 TF 高;并且在语料库中其他文档中很少出现,即 DF 低,也即 IDF 高,则认为这个词具有很好的类别区分能力。
更好的 BOW
有了 n-grams 和 TF-IDF 的概念就可以改进 BOW 的缺陷。主要是下面两个方面:
- 用 TF-IDF 的值取代单词计算中的计数器
- 逐行标准化结果(除以 L2 正则)