【无标题】

目录

  • 一、课题背景和开发环境
  • 二、准备工作
    • 1. 安装Gensim库
    • 2. 对原始语料分词
  • 三、训练Word2Vec模型
  • 四、模型应用
    • 1.计算词汇相似度
    • 2. 找出不匹配的词汇
    • 3.计算词汇的词频

  • 本文为365天深度学习训练营 中的学习记录博客
  • 原作者:K同学啊|接辅导、项目定制

一、课题背景和开发环境

第N3周:调用Gensim库训练Word2Vec模型

  • Python 3.8.12
  • gensim==4.3.1
  • numpy==1.21.5 -> 1.24.3
  • portalocker==2.7.0
  • pytorch==1.8.1+cu111
  • torchtext==0.9.1

本周任务:

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

二、准备工作

1. 安装Gensim库

pip install gensim

2. 对原始语料分词

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

import jieba
import jieba.analyse


def BuildPrefixDict(txtfilepath):
    # 加入一些词(人名),使得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)
    jieba.suggest_freq('赵德汉', True)
    with open(txtfilepath, encoding='utf-8') as f:
        result_cut = []
        lines = f.readlines()
        for line in lines:
            result_cut.append(list(jieba.cut(line)))
    f.close()
    return result_cut


# 添加自定义停用词
stopwords_list = [",","。","\n","\u3000"," ",":","!","?","…"]
def remove_stopwords(ls):  # 去除停用词
    return [word for word in ls if word not in stopwords_list]


# 用jieba分词获取语料数据字典
result_cut = BuildPrefixDict('./data/in_the_name_of_people.txt')
# 去除标点符号
result_stop=[remove_stopwords(x) for x in result_cut if remove_stopwords(x)]
print(result_stop[1000:1003])

拿到了分词后的文件,在一般的NLP处理中,会需要去停用词。由于word2vec的算法依赖于上下文,而上下文有可能就是停词。因此对于word2vec,我们可以不用去停词,仅仅去掉一些标点符号,做一个简单的数据清洗。
现在我们可以直接读分词后的文件到内存。这里使用了word2vec提供的LineSentence类来读文件,然后套用word2vec的模型。在实际应用中,可以调参提高词的embedding的效果。

三、训练Word2Vec模型

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

四、模型应用

1.计算词汇相似度

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

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

2. 找出不匹配的词汇

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

3.计算词汇的词频

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

你可能感兴趣的:(深度学习,深度学习,人工智能,机器学习,nlp)