概述
参考https://www.cnblogs.com/pinard/p/7278324.html
计算词向量
gensim计算词向量需要执行三个步骤
model=gensim.models.Word2Vec()#建立模型对象
model.build_vocab(sentences) #遍历语料库建立词典
model.train(sentences) #建立模型
也可以直接调用gensim.models.Word2Vec()
其参数:
sg默认等于0,为CBOW算法,设置为1是Skip-gram算法
size是输出词向量的维数,值太小会导致词映射因为冲突而影响结果,值太大会耗内存并使算法计算变慢,一般取100到200之间
window=n是句子中当前词与目标词之间的最大距离,n表示在目标词前看n-b个词,后看b个词(b在0~n直接随机),默认3
sample表示更高频率的词被随机下采样到所设置的阈值,默认为1e-3
hs默认为0,即negative Sampling,是1的话并且负采样(negative)个数大于0,则是Hierarchical Softmax。
negative即使用negaative sampling时负采样的个数,默认是5。推荐在[3,10]之间
cbow_mean 仅用于CBOW在做投影的时候,为0,为1(默认)则为上下文的词向量的平均值。不推荐修改。
min_count 需要计算词向量的最小词频,默认是5,小语料可调低这个值。
iter 随机梯度下降法中迭代的最大次数,默认是5,大语料可增大这个值
alpha 在随机梯度下降法中迭代的初始步长,默认是0.025
min_alpha 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。对于大语料,需要对alpha, min_alpha,iter一起调参,来选择合适的三个值。
import gensim
# 分词结果
sentences = ['传统 数据 基本 都是 结构 化 数据 每个 字 段 都是 有用 的 价值 密度 非常 高'.split(),
'大 数据 时代 越来越 多 数据 都是 半 结构 化 和 非 结构 化 数据 比如 网站 访问 日志 里面 大量 内容 都是 没 价值 的 真正 有价值 的 比较 少 虽然 数据量 比 以前 大 了 N 倍 但 价值 密度 确实 低 了 很多'.split()]
model = gensim.models.Word2Vec(sentences, sg=1, size=100, window=3,
min_count=2, negative=3, sample=0.001, hs=1,
workers=6)
# 保存模型
word2vec_save = './word2vec_model.txt'
model.wv.save_word2vec_format(word2vec_save, binary=False)
# 读取模型
model = gensim.models.KeyedVectors.load_word2vec_format(word2vec_save,binary=False)
print(model['数据'])
计算相似度
model.most_similar(positive=['word1','word2'],topn=10),找出近义词中最相似的topn个词
model.most_similar(negative=['word1','word2'],topn=10),找出反义词中最相似的topn个词
model.doesnt_match(['word1','word2','word3','word4']),找出不匹配的词语
model.similarity(['word1','word2']),计算两个词语的相似度
例:
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 26 10:44:08 2020
@author: catEyes
"""
import pandas as pd
import jieba
import gensim
filename = '../网络新闻实体发现与情感识别/train.txt'
with open(filename,'r', encoding='utf-8') as f:
data = (line.strip() for line in f)
# 转换为标准json格式
data_json="[{0}]".format(','.join(data))
f.close()
# 转换成dataframe格式
data = pd.read_json(data_json)
# 将出现的实体添加进自定义词典
for Entity_list in data['coreEntityEmotions']:
for obj in Entity_list:
jieba.add_word(obj['entity'])
# 分词
sentences = []
for sentence in list(data['title']+' '+data['content']):
seg_list = jieba.cut(sentence, cut_all=False)
sentences.append(" ".join(seg_list).split())
# 去停用词
stopwordsFile = "D:\NLP\stopwords-master\中文停用词表.txt"
stopwords = [line.strip() for line in
open(stopwordsFile, encoding='utf-8').readlines()]
out_sentences = []
for obj in sentences:
ws = []
for w in obj:
if w not in stopwords:
ws.append(w)
if ws != []:
out_sentences.append(ws)
# 训练词向量
model = gensim.models.Word2Vec(out_sentences, sg=1, size=100, window=3,
min_count=3, negative=3, sample=0.001, hs=1,
workers=6)
# 保存模型
word2vec_save = './word2vec_model.txt'
model.wv.save_word2vec_format(word2vec_save, binary=False)
# 读取模型
model = gensim.models.KeyedVectors.load_word2vec_format(word2vec_save,
binary=False)
# 相似度分析
# 近义词中最相似的词语
print(model.most_similar(positive=['有利于'], topn=2))
# 反义词中最相似的词语
print(model.most_similar(negative=['继续'], topn=2))
# 找出气质不合的词语
print(model.doesnt_match(['中国','美国','日本','明星']))
# 计算两词的相似度
print(model.similarity('黑寡妇','惊奇队长'))
输出:
可以打印词向量查看:
数据来源--CCF赛题网络新闻实体发现与情感识别
最后
以上就是激昂棒球为你收集整理的Gensim:word2vec(jieba分词,去停用词)的全部内容,希望文章能够帮你解决Gensim:word2vec(jieba分词,去停用词)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复