NLP成长计划(二)
Setup
假设您已经完成了(一)所需的设置。
在本讲座中,我们将使用 Gensim和NLTK,这两个广泛使用的Python自然语言处理库。
如果我们想要能够对文本进行分类,我们需要能够根据文章、段落、句子和文本的其他主体所包含的信息以及它们所表示的内容来生成它们的特征。有很多方法可以做到这一点,我们将采用3种方法。
Term-Document
Bag-of-Words
从文本中提取特征的一种最简单的方法是只计算一个单词在正文中出现的次数。在这个模型中,单词的顺序并不重要,只考虑每个文档中每个唯一术语的出现次数。
清除文本数据
删除停顿和标点符号,小写
- 有时在将文件分解成令牌单位时放弃停用词是有用的。停用词是语料库中经常出现的术语,它们对手头的任务几乎没有任何信息价值。常用的停用词包括单词、单词、单词和单词。
- 标点符号非常相似;虽然它们可以提供语言环境,但有时标点符号太常见,无法提供任何价值。
这些都是停顿或标点符号!
还好,有一种简单的方法来移除它们:nltk和内置的字符串模块有单独的停顿词和标点符号列表
Stemming and Lemmatizing
-
我们也可以发现很多词有相似的意思,但只有它们的词性形式等不同。有时在索引之前将同一个单词的不同形式归一化给单个根标记是有意义的。有两种方法可以做到这一点:
-
Stemming: 启发式方法,切去不同形式单词的结尾,试图返回即使有各种变体也保持相同的词根语素。
- 比如:
- I saw that movie and it was terrible →→ I saw that movi and it wa terribl
- informative informational inform informing →→ inform inform inform inform
- 比如:
-
Lemmatizing: 返回派生的范式或单词的字典形式,称为 lemma
- 比如:
- I saw that movie and it was terrible →→ I see that movie and it be terrible
- am are is be →→ be be be be
- 比如:
-
请注意,当我们使用这个模型来特征化文本:
- 每个特征向量的长度将是语料库中词汇量的大小。
- 因此,正文的每一个都有很多0。
TF-IDF
Term Frequency: Number of occurrences of a word in a document(文档中单词的出现次数)
Inverse Document Frequency: Number of documents that contain a certain word scaled by a weight(包含按权重缩放的某个词的文档数)
Term Frequency - Inverse Document Frequency: (ww这个词在TT这个文档中出现的次数) * loglog(语料库中的文档数/包含按权重缩放的ww这个词的文档数)
让我们看看我们之前审查的电影评论的TF IDF分数。
看起来更像是一个我们可以用来进行文本分类的特征向量!
请注意,在TF IDF模型中:
- 如果一个词频繁地出现在语料库中(比如那些停用词),这会让这些词的得分很低
- 更罕见的术语通常会有更高的分数。它们往往更具信息性和描述性
- 在语料库内的少量文档中经常出现的术语将具有最高的分数
Term-Context
NLP对象的绝大多数被认为是原子符号: king, queen, book, etc.
在向量空间项中,这个向量有一个1和许多0。
king=[1,0,0,0,0,0,0,0,0]
queen=[0,1,0,0,0,0,0,0,0]
book=[0,0,1,0,0,0,0,0,0]
这被称为"one-hot"表示法。在模型中表示类别是一种常用的方法。然而,它非常稀疏(正如我们从BOW模型中看到的),每行主要是0。
你可以通过它相邻的词来代表一个词,这样就能获得更多的信息。我们可以使用小的上下文来代替整个文档。
- 段落
- 句子
- 一个窗口大小的连续序列
这样,在上下文单词计数上定义单词(假设在相似上下文中出现的两个词本身是相似的)
但是基于计数的模型有缺点:
- 向量大小变大,等于词汇量大小
- 稀疏
- 带来维度灾难
- 计算代价很高
Word2Vec
Word2Vec是一个无监督神经网络模型,它最大化上下文邻居之间的相似性,同时最小化不可见上下文的相似性。通过滑动窗口对模型在语料库上进行训练,随机生成初始向量并收敛。在训练过程开始时设置目标向量的大小,因此向量是密集的,不需要降维技术。
Continuous Bag of Words
训练目标是对于给出上下文词wc1,wc2,...wcjwc1,wc2,...wcj最大化观察到正确的目标词wt的概率。
预测向量被设置为所有上下文字向量的平均值。
Skip-gram
训练目标是对于给出目标词wt最大化观察到正确的上下文词wc1,wc2,...wcjwc1,wc2,...wcj的概率。
在这种情况下,预测向量是目标词向量。
比如
现在让我们试着训练我们自己的单词嵌入,看看我们能用它们做什么。
Word2Vec
-
size
: 字嵌入模型的维数 -
window
: 在每个方向观察的上下文词汇的数目 -
min_count
: 模型中包含的词的最小频率 -
sg
(Skip-Gram): '0' 代表 CBOW 模型; '1' i表示 Skip-Gram -
alpha
: 学习率(初始值);防止模型过校正,使收敛更精确。 -
iterations
: 通过数据集的次数 -
batch_words
: 在每次通过时从数据中取样的单词数
单词向量是空间中的方向,可以对单词之间的关系进行编码。
词汇之间的接近可以通过余弦相似性来计算。
Doc2Vec
Doc2Vec, word2vec最强大的扩展
Doc2vec (又名 paragraph2vec 或者 sentence embeddings) 将word2vec算法从词向量扩张到更大的文本, 比如句子、段落或者整个文件
每个段落都映射到一个唯一的向量,用矩阵D中的列来表示,每个单词也映射到一个唯一的向量,用矩阵W中的列来表示。段落向量和字向量被平均或级联以预测上下文中的下一个单词。
每个附加上下文都不是固定长度(因为它被矢量化并投影到同一空间)。
额外的参数,但更新是稀疏的,因此仍然有效。
Distrubted Memory (DM)分散内存
亮点:
- 为每个DOC分配和随机初始化段落向量
- 使用上下文词和段落向量预测下一个单词
- 在DOC上滑动上下文窗口,但保持段落向量固定(因此:分散内存)
- 通过SGD和反向支柱更新权重
Distrubted Bag of Words (DBOW)
亮点:
- 只使用段落向量(无词向量)
- 在段落中取一个单词窗口,随机抽取哪些段落用段落向量预测
- 更简单,更有效记忆
让我们尝试用Gensim建立自己的DOC2VEC模型
Doc2Vec参数
-
size
: 嵌入模型的维数 -
window
: 在文档中的每个方向上观察的上下文字的数目 -
min_count
: 包含在模型中的单词的最小频率 -
dm
(distributed memory):“0”表示dBuy模型;“1”表示DM -
alpha
: Learning rate (initial); 学习速率(初始);防止模型过度校正,使收敛更精细 -
iter
: 通过语料库的迭代次数