Gensim:word2vec(jieba分词,去停用词)

参考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赛题网络新闻实体发现与情感识别

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值