词袋模型(Bag of Words)
词袋模型特点:离散、高维、稀疏
在信息检索中,词袋模型假定对于一个文本,忽略其词序和语法、句法,将其仅仅看做是一个词集合,或者说是词的一个组合,文本中每个词的出现都是独立的,不依赖于其他词是否出现,或者说当这篇文章的作者在任意一个位置选择一个词汇都不受前面句子的影响而独立选择的。
简单来说,词袋模型假设不考虑文本中词与词之间的上下文关系,仅仅只考虑所有词的权重。而权重与词在文本中出现的频率有关,因此词袋模型可以看作是一种统计直方图。
词袋模型不考虑词语之间的顺序,认为“重庆今年5月很凉快”和“很凉快重庆5月今年”是等价的。而与词袋模型相反的一个模型是n-gram,n-gram考虑了词汇出现的先后顺序
缺点:没有考虑文本中词与词之间的上下文关系(即不考虑词语之间的顺序),很可能会造成文本误判,即把意思相反的文本,认为高度相似,如:我爱看电影 VS 我不爱看电影
可以使用 sklearn 中的 CountVectorizer 来实现词袋模型:
from sklearn.feature_extraction.text import CountVectorizer
词向量()
-
词向量
输入为稀疏向量 ==> 输出为稠密向量(词向量,就是神经网络参数)
简单来讲,就是对词典 D 中的任意词 w,指定一个固定长度的实值向量 v(w),其中设 m 为向量的长度,v(w) 就是词 w 的词向量
-
分布式表示特点:连续、低维、稠密
word2vec
word2vec 中有 CBOW(Continuous Bag-of-Words Model)和 Skip-gram(Continuous Skip-gram Model)两个重要模型
而且还给出了实现上述模型的两套框架:Hierarchical Softmax 和 Negative Sampling。其中,Negative Sampling(NEG)是 Noise Contrastive Estmation(NCE)的一个简化版本,目的是用来提高训练速度、改善所得词向量的质量。与 Hierarchical Softmax 相比,NEG 不再采用复杂的Huffman 树,而是利用相对简单的随机负采样,能大幅提高性能,可作为 Hierarchical Softmax 的一种替代。
CBOW模型
- 基于 Hierarchical Softmax 的 CBOW
- 基于 Negative Sampling 的 CBOW
Skip-gram 模型
- 基于 Hierarchical Softmax 的 Skip-gram
- 基于 Negative Sampling 的 Skip-gram
用gensim学习word2vec
import jieba
from gensim.models import word2vec
import logging
import os
jieba.suggest_freq('沙瑞金', True)
jieba.suggest_freq('田国富', True)
jieba.suggest_freq('高育良', True)
jieba.suggest_freq('侯亮平', True)
jieba.suggest_freq('钟小艾', True)
jieba.suggest_freq('陈岩石', True)
jieba.suggest_freq('欧阳菁', True)
jieba.suggest_freq('易学习', True)
jieba.suggest_freq('王大路', True)
jieba.suggest_freq('蔡成功', True)
jieba.suggest_freq('孙连城', True)
jieba.suggest_freq('季昌明', True)
jieba.suggest_freq('丁义珍', True)
jieba.suggest_freq('郑西坡', True)
jieba.suggest_freq('赵东来', True)
jieba.suggest_freq('高小琴', True)
jieba.suggest_freq('赵瑞龙', True)
jieba.suggest_freq('林华华', True)
jieba.suggest_freq('陆亦可', True)
jieba.suggest_freq('刘新建', True)
jieba.suggest_freq('刘庆祝', True)
with open('in_the_name_of_people.txt', 'rb') as f:
document = f.read()
document_cut = jieba.cut(document)
result = ' '.join(document_cut)
result = result.encode('utf-8')
with open('in_the_name_of_people_segment.txt', 'wb') as f2:
f2.write(result)
f.close()
f2.close()
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.LineSentence('in_the_name_of_people_segment.txt')
model = word2vec.Word2Vec(sentences, hs=1, min_count=1, window=3, size=100)