情感分析

如何把文字转化为向量

如何把将文本向量化时如何保持句子原有的语义.

文本向量化的流程

graph TD
文本 --jieba--> 分词 --Word2Vec--> 生成词向量 --Gensim-->特征向量矩阵 --> 网络模型

jieba

  • 分词器,就是把一句话中的词提取出来

word2vec梯度参数

常用参数
model = Word2Vec(size=vocab_dim,
                 min_count=n_exposures,
                 window=window_size,
                 workers=cpu_count,
                 iter=n_iterations)
sentence:语料句子,必须是一个可迭代的对象
min_counts:指定了需要训练的词语最小出现次数,小于该值的词将被忽略
max_vocab_size:最大词汇数,防止内存溢出
size:词向量维度
alpha:训练的初始学习率,随着训练的进行,学习率会线性减少
min_alpha:最小学习率
window:滑动窗口大小
sg:训练模型(0:CBOW;1:skip-gram)
hs:word2vec两个解法的选择了,如果是0, 则是Negative Sampling,是1的话并且负采样个数negative大于0, 则是Hierarchical Softmax。默认是0即Negative Sampling。
iter:迭代次数
#加载词表
model.build_vocab(combined) # input: list
#训练
model.train(combined,total_examples=model.corpus_count,epochs=n_iterations)
#保存词向量模型到pkl中
model.save(r'D:BaiduNetdiskDownloadkearsImgSentimentAnalysis-mastermodel_testWord2vec_model.pkl')

gensim

  • Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。

  • 它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法

gensim_dict = Dictionary()
#由doc2bow变为词袋,输出的格式为
gensim_dict.doc2bow(model.wv.vocab.keys(), allow_update=True)
# 字典转换为以词为k
w2indx = {v: k+1 for k, v in gensim_dict.items()}
#向量
w2vec = {word: model[word] for word in w2indx.keys()}

网络结构

model = Sequential()  # or Graph or whatever
# 词向量转化为密集矩阵
# 可以通过weights参数指定初始的weights参数 因为Embedding层是不可导的 梯度东流至此回,所以把embedding放在中间层是没有意义的,emebedding只能作为第一层 注意weights到embeddings的绑定过程很复杂,weights是一个列表,根据上面得到的向量来的
for word, index in index_dict.items():
    embedding_weights[index, :] = word_vectors[word]
model.add(Embedding(output_dim=vocab_dim,
                    input_dim=n_symbols,
                    mask_zero=True,
                    weights=[embedding_weights],
                    input_length=input_length))  # Adding Input Length
# RNN                    
model.add(LSTM(50, activation='tanh'))
model.add(Dropout(0.5))