调用Gensim库训练Word2Vec模型

一、前期工作:

1. 安装Gensim库

python 复制代码
pip install gensim

2.安装chardet库

python 复制代码
pip install chardet

3. 对原始语料分词

选择《人民的名义》的小说原文作为语料,先采用jieba进行分词

python 复制代码
import jieba
import jieba.analyse
import chardet
jieba.suggest_freq('沙瑞金', True)  # 加入一些词,使得jieba分词准确率更高
jieba.suggest_freq('田国富', True)
jieba.suggest_freq('高育良', True)
jieba.suggest_freq('侯亮平', True)
jieba.suggest_freq('钟小艾', True)
jieba.suggest_freq('陈岩石', True)
jieba.suggest_freq('欧阳菁', True)
jieba.suggest_freq('易学习', True)
jieba.suggest_freq('王大路', True)
jieba.suggest_freq('蔡成功', True)
jieba.suggest_freq('孙连城', True)
jieba.suggest_freq('季昌明', True)
jieba.suggest_freq('丁义珍', True)
jieba.suggest_freq('郑西坡', True)
jieba.suggest_freq('赵东来', True)
jieba.suggest_freq('高小琴', True)
jieba.suggest_freq('赵瑞龙', True)
jieba.suggest_freq('林华华', True)
jieba.suggest_freq('陆亦可', True)
jieba.suggest_freq('刘新建', True)
jieba.suggest_freq('刘庆祝', True)
jieba.suggest_freq('赵德汉', True)
 
result_cut = []
with open('./in_the_name_of_people.txt', 'rb') as f:
    raw_data = f.read()
    encoding = chardet.detect(raw_data)['encoding']
    lines = raw_data.decode(encoding).splitlines()
    for line in lines:
        result_cut.append(list(jieba.cut(line)))
 
# 在这里处理分词结果result_cut
 
# 不需要再调用 f.close(),因为使用了 with 语句会自动关闭文件
python 复制代码
# 添加自定义停用词
stopwords_list = [",","。","\n","\u3000"," ",":","!","?","..."]
 
def remove_stopwords(ls):  # 去除停用词
    return [word for word in ls if word not in stopwords_list]
 
result_stop=[remove_stopwords(x) for x in result_cut if remove_stopwords(x)]

从文本数据中移除停用词,停用词是在文本分析中通常需要被排除的词,如标点符号、空格等,因为它们对于意义的分析通常没有贡献。

python 复制代码
print(result_stop[100:103])

二、训练Word2Vec模型

python 复制代码
from gensim.models import Word2Vec
 
model = Word2Vec(result_stop,     # 用于训练的语料数据
                 vector_size=100, # 是指特征向量的维度,默认为100。
                 window=5,        # 一个句子中当前单词和被预测单词的最大距离。
                 min_count=1)   # 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5。

三、模型应用

1.计算词汇相似度

我们可以使用similarity()方法计算两个词汇之间的余弦相似度。

python 复制代码
# 计算两个词的相似度
print(model.wv.similarity('沙瑞金', '季昌明'))
print(model.wv.similarity('沙瑞金', '田国富'))
python 复制代码
# 选出最相似的5个词
for e in model.wv.most_similar(positive=['沙瑞金'], topn=5):
    print(e[0], e[1])

这段代码是使用词向量模型(通常是Word2Vec或类似的模型)来找出与给定词(在这个例子中是"沙瑞金")最相似的5个词。这是自然语言处理(NLP)领域常见的一种做法,用于寻找语义上相近的词。下面是这段代码的逐步解释:

  1. 词向量模型 (model) : 已经训练好的词向量模型存储在变量model中。词向量模型能够将词汇表中的每个词映射到一个向量空间中,这样语义相近的词就会在这个空间中彼此靠近。

  2. 查找最相似的词 (model.wv.most_similar):

    • model.wv.most_similar(positive=['沙瑞金'], topn=5) 这行代码调用了模型的 most_similar 方法,用于查找与列表positive中的词语最相似的词。这里,positive参数是一个包含一个或多个词的列表,用于指定要寻找相似词的目标。在这个例子中,列表中只有一个词:"沙瑞金"。
    • topn=5 参数指定了需要返回的最相似词的数量。在这里,它被设置为5,意味着方法将返回与"沙瑞金"最相似的5个词。
  3. 遍历和打印结果:

    • for e in model.wv.most_similar(positive=['沙瑞金'], topn=5): 这行代码遍历 most_similar 方法返回的结果。每个结果 e 是一个元组,其中包含一个词和它与"沙瑞金"在语义上的相似度。
    • print(e[0], e[1]) 这行代码打印每个元组的第一个元素(相似的词)和第二个元素(与"沙瑞金"的相似度)。相似度是一个介于0和1之间的浮点数,数值越大表示相似度越高。

2. 找出不匹配的词汇

使用doesnt_match()方法,我们可以找到一组词汇中与其他词汇不匹配的词汇。

python 复制代码
odd_word = model.wv.doesnt_match(["苹果", "香蕉", "橙子", "书"])
print(f"在这组词汇中不匹配的词汇:{odd_word}")

3. 计算词汇的词频

我们可以使用get_vecattr()方法获取词汇的词频。

python 复制代码
word_frequency = model.wv.get_vecattr("沙瑞金", "count")
print(f"沙瑞金:{word_frequency}")
相关推荐
冷雨夜中漫步7 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴8 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再8 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
yLDeveloper9 小时前
从模型评估、梯度难题到科学初始化:一步步解析深度学习的训练问题
深度学习
喵手9 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
Coder_Boy_10 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
2501_9449347310 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy10 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
2401_8362358610 小时前
中安未来SDK15:以AI之眼,解锁企业档案的数字化基因
人工智能·科技·深度学习·ocr·生活
njsgcs10 小时前
llm使用 AgentScope-Tuner 通过 RL 训练 FrozenLake 智能体
人工智能·深度学习