一、词袋模型概念
缺点:没有考虑文本中词与词之间的上下文关系(即不考虑词语之间的顺序)
- 离散
词袋模型假设我们不考虑文本中词与词之间的上下文关系,仅仅只考虑所有词的权重。 - 高维
词袋模型由于大部分文本都只会用词汇表中很少一部分的词,因此词向量中有大量的0,所以是向量的维度是很大的。 - 稀疏
词袋模型由于大部分文本都只会用词汇表中很少一部分的词,因此词向量中有大量的0,也就是说词向量是稀疏的。
二、分布式表示模型
分布式表示(distributed representation),描述的是把文本分散嵌入到另一个空间,一般从是从高维空间嵌入到低维空间。
参考 http://www.sohu.com/a/231566096_633700
- 连续
- 低维
- 稠密
三、Word2vec词向量原理
从向量的角度来看,字符串形式的词语其实是更高维、更稀疏的向量。若词汇表大小为N,每个字符串形式的词语字典序为i,则其被表示为一个N维向量,该向量的第i维为1,其他维都为0。汉语的词汇量大约在十万这个量级,十万维的向量对计算来讲绝对是个维度灾难。而word2vec得到的词的向量形式(下文简称“词向量”,更学术化的翻译是“词嵌入”)则可以自由控制维度,一般是100左右。
word2vec主要包括两种模式:CBOW与Skip-Gram模式
其中的原理参考 http://www.hankcs.com/nlp/word2vec.html
- CBOW(Continuous Bag of Words)
CBOW是从原始语句推测目标字词,CBOW对小型数据库比较合适 - Skip-Gram
Skip-Gram是从目标字词推测出原始语句,Skip-Gram在大型语料中表现更好
实验部分
实验部分是《人民的名义》小说作为训练语料,分词采用的是结巴分词,使用gensim库中的word2vec模块,
各个参数含义如下:sentences (iterable of iterables, optional) – 供训练的句子,可以使用简单的列表,但是对于大语料库,建议直接从磁盘/网络流迭代传输句子。hs ({0, 1}, optional) – 1: 采用hierarchical softmax训练模型; 0: 使用负采样。min_count (int, optional) – 忽略词频小于此值的单词。window (int, optional) – 一个句子中当前单词和被预测单词的最大距离。size (int, optional) – word向量的维度。
主要代码如下:
import logging
import os
from gensim.models import word2vec
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.LineSentence(r'D:/in_the_name_of_people_segment.txt')
model = word2vec.Word2Vec(sentences, hs=1, min_count=1, window=3,size=20)
req_count = 5
for key in model.wv.similar_by_word('沙瑞金',topn =20): #20是设置每个词语提取向量的个数
if len(key[0])==3:
req_count -= 1
print (key[0], key[1])
if req_count == 0:
break;
print(model['沙瑞金'])
结果是与“沙瑞金”最相近的词以及相似度
“沙瑞金”对应的向量