利用word2vec包将中文转变为词向量

代码展示:

import jieba
import re
import json
import logging
import sys
import gensim.models as word2vec
from gensim.models.word2vec import LineSentence, logger

pattern = u'[\\s\\d,.<>/?:;\'\"[\\]{}()\\|~!\t"@#$%^&*\\-_=+a-zA-Z,。\n《》、?:;“”‘’{}【】()…¥!—┄-]+'


def get_sentence(data_file):
    f = open(data_file, encoding='utf-8') #读取json数据
    reader = f.readlines()
    sentences = []  # 修改:存放每个句子的列表
    for line in reader:
        line = json.loads(line.strip())
        sentence = ' '.join(jieba.cut(re.sub(pattern, '', line['sentence'])))
        sentences.append(sentence)  # 修改:将每个分词后的句子添加到 sentences 列表中
    word_lists = [sentence.split() for sentence in sentences]
    return word_lists
    # 词向量模型输入的是双列表格式,一个大列表里面嵌套多个小列表

def train_word2vec(sentences, out_vector):
    # 设置输出日志
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
    logger.info("running %s" % ' '.join(sys.argv))

    # 训练word2vec模型,vector_size代表的是词向量的维度,window是选取中心词前后五个词语作为训练,epochs为迭代的次数,min_count为选区的考虑计算的单词的最低词频
    model = word2vec.Word2Vec(sentences, vector_size=100, sg=1, window=5, min_count=5, workers=4, epochs=5)

    # 保存word2vec模型
    model.save("word2vec_model.model")

    # 保存词向量到文件
    model.wv.save_word2vec_format(out_vector, binary=False)


def load_model(w2v_path):
    model = word2vec.Word2Vec.load(w2v_path)  # 读取保存的模型

    return model


def calculate_most_similar(model, word):
    similar_words = model.wv.most_similar(word)  #可以添加参数topn指定最相关的多少个词语展示
    print(word)
    for term in similar_words:
        print(term[0], term[1])


if __name__ == '__main__':
    # out_vector = 'word_vectors.txt'
    # word_lists = get_sentence('train.json')
    # print(word_lists)
    # train_word2vec(word_lists, out_vector)
    model = load_model('word2vec_model.model')
    calculate_most_similar(model, "广东")  # 输出与美国在词向量空间中相近的词
    words = model.wv.most_similar(positive=['中国','美国'],negative=['广东'])  # 类比关系实验
    print(words)

结果展现:

word2vec.Word2Vec 方法中的参数含义如下:

  • sentences:输入的句子集合,可以是一个可迭代对象,每个元素表示一个句子,句子则是由单词组成的列表。

  • vector_size:词向量的维度大小。它决定了每个单词在训练过程中学习到的词向量的维度。

  • window:词向量训练时的上下文窗口大小。窗口大小表示当前词与预测词之间的最大距离。在训练时,窗口大小决定了模型考虑的上下文单词数量。

  • min_count:忽略频率低于此值的单词。如果一个单词在整个语料库中的出现次数少于 min_count,则该单词将被忽略,不会被用于训练模型。

  • workers:训练时使用的线程数量,用于加速训练过程。指定多个线程可以加快模型的训练速度。

  • sg:用于指定训练算法的模型类型。当 sg=0 时,表示使用 CBOW 模型;当 sg=1 时,表示使用 Skip-Gram 模型。

  • epochs:指定训练的迭代次数。一个迭代表示对整个语料库的一次遍历。

这些参数共同决定了 Word2Vec 模型的训练过程和最终学习到的词向量的质量。根据具体的应用场景和语料库的特点,可以调整这些参数以获得更好的结果。

sentence的具体格式(两个列表):

sentences = [['海陆空', '全能', '反恐', '王'], ['说', '出来', '你', '可能', '不', '信', '旅游', '日', '免费', '吃', '砂锅', '自助餐']]

one-hot缺点
维度灾难
无法度量词语之间的相似性
词向量(用一组向量表示词语)
重要假设:文本中离得越近的词语相似度越高
两种计算方法:CBOW skip-gram
前者用上下文词来预测中心词,通过上下文此计算中心词的词向量与实际值做对比,根据让损失下降来更新权重参数
后者用中心词来预测上下文此,用的最多
问题1:需要指定窗口大小,即中心词周围选几个词语来计算
问题2:优化问题中需要综合考虑靠近中心词的词和非靠近中心词的词,语料库大,非上下文词太大,因此只采样部分非靠近中文词的词,即负样本(negative)
问题3:设置迭代的次数,以及最小参与计算的词语的频数的阈值
问题4:指定词向量的维度

如何评估词向量
1.输出与特定词语的相关度比较高的词语
2.可视化
3.类比实验:国王-王后=男人-女人

词向量用途
1.主题聚类
2.情感分析
3.信息检索

词向量缺点
1.没有考虑多义词
2.窗口长度有限
3.没有考虑全局的文本信息
4.不是严格意义的语序


python处理步骤
1.读取数据,作分词,得到双列表数据,一个大列表套一个小列表,小列表中为很多个词语
2.模型训练,自行设定词向量维度vector_size,窗口大小window,最小过滤词频min_count,迭代次数epochs,负采样个数negative
3.模型评估

 

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学习各种软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值