您现在的位置是:首页 >技术杂谈 >NLP实战:调用Gensim库训练Word2Vec模型网站首页技术杂谈

NLP实战:调用Gensim库训练Word2Vec模型

牛大了2023 2024-08-25 12:01:02
简介NLP实战:调用Gensim库训练Word2Vec模型

目录

 一、准备工作

1. 安装Gensim库

2. 对原始语料分词

二、训练Word2Vec模型

三、模型应用

1.计算词汇相似度

​编辑

2. 找出不匹配的词汇

3. 计算词汇的词频

四、总结


? 本文为[?365天深度学习训练营]内部限免文章(版权归 *K同学啊* 所有)
? 作者:[K同学啊]

? 本周任务:
●阅读NLP基础知识里Word2vec详解一文,了解并学习Word2vec相关知识
●学习本文内容,在下一篇文章中,将使用Word2vec辅助完成文本分类任务

数据集是一本电子书,txt格式

一、准备工作

1. 安装Gensim库

调出控制台pip安装即可

pip install gensim

2. 对原始语料分词

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

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 语句会自动关闭文件

# 添加自定义停用词
stopwords_list = [",","。","
","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)]

拿到了分词后的文件,在一般的NLP处理中,会需要去停用词。由于word2vec的算法依赖于上下文,而上下文有可能就是停词。因此对于word2vec,我们可以不用去停词,仅仅去掉一些标点符号,做一个简单的数据清洗。

现在我们可以直接读分词后的文件到内存。这里使用了word2vec提供的LineSentence类来读文件,然后套用word2vec的模型。在实际应用中,可以调参提高词的embedding的效果。

print(result_stop[100:103])

[['赵德汉', '慌', '了', '忙', '把门', '卡往', '外', '掏', '这', '这', '什么', '呀', '这', '是'], ['你', '帝京', '苑', '豪宅', '的', '门', '卡', '啊', '请', '继续', '配合', '我们', '执行公务', '吧'], ['赵德汉', '的', '幽默感', '瞬间', '消失', '一下子', '软软', '瘫坐', '到', '地上']] 

二、训练Word2Vec模型

from gensim.models import Word2Vec

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

三、模型应用

1.计算词汇相似度

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

# 计算两个词的相似度
print(model.wv.similarity('沙瑞金', '季昌明'))
print(model.wv.similarity('沙瑞金', '田国富'))

0.9994414
0.9994026

# 选出最相似的5个词
for e in model.wv.most_similar(positive=['沙瑞金'], topn=5):
    print(e[0], e[1])

2. 找出不匹配的词汇

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

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

在这组词汇中不匹配的词汇:书

3. 计算词汇的词频

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

word_frequency = model.wv.get_vecattr("沙瑞金", "count")
print(f"沙瑞金:{word_frequency}")

沙瑞金:353

四、总结

本文主要介绍了如何使用Word2Vec进行自然语言处理任务。下面是对文章内容的总结:

  1. 首先需要安装Gensim库,它是用于训练Word2Vec模型的Python库。

  2. 文章选择《人民的名义》作为语料,使用jieba进行分词。还加入了一些自定义词,以提高jieba的分词准确率。

  3. 分词后的结果可以进行数据清洗,去除一些标点符号等简单的处理。

  4. 使用Gensim库中的Word2Vec类训练Word2Vec模型。需要传入分词后的语料数据,设置特征向量的维度、窗口大小和词频阈值等参数。

  5. 训练完成后,可以进行模型应用。例如,可以使用similarity()方法计算两个词汇之间的余弦相似度,或者使用most_similar()方法找出与指定词汇最相似的词汇。

  6. 还可以使用doesnt_match()方法找出一组词汇中与其他词汇不匹配的词汇,或者使用get_vecattr()方法获取词汇的词频。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。