365天深度学习打卡 第N3周:调用Gensim库训练Word2Vec模型

本周任务

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

数据集:
in_the_name_of_people.txt

准备工作

1.安装Gensim库

pip install gensim

自然语言处理,简称 NLP,是人工智能的一个分支,它允许机器理解、处理和操纵人类语言。Gensim是在做自然语言处理时较为经常用到的一个工具库,主要用来以无监督的方式从原始的非结构化文本当中来学习到文本隐藏层的主题向量表达。

大名鼎鼎的 Gensim 是一款具备多种功能的神器。 它是一个著名的开源 Python
库,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。它处理大量文本数据的能力和训练向量embedding的速度使其有别于其他
NLP 库。此外,Gensim 支持包括TF-IDF,LSA,LDA,和
word2vec在内的多种主题模型算法,用此很多算法工程师会将其作为主题建模的首选库。

2. 对原始语料分词

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

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

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])

输出

Building prefix dict from the default dictionary …
Loading model from cache C:\Users\ADMINI~1\AppData\Local\Temp\jieba.cache
Loading model cost 0.692 seconds.
Prefix dict has been built successfully.
[[‘说来’, ‘也’, ‘巧’, ‘那日’, ‘上午’, ‘张’, ‘华华’, ‘奉命’, ‘带’, ‘着’, ‘两个’, ‘女’, ‘同志’, ‘到京州’, ‘城市’, ‘银行’, ‘传’, ‘欧阳菁’, ‘时’, ‘一个’, ‘新’, ‘情况’, ‘发生’, ‘了’, ‘—’, ‘—’, ‘那张’, ‘沉寂’, ‘的’, ‘银行卡’, ‘居然’, ‘奇迹’, ’ 般’, ‘活动’, ‘了’, ‘监视’, ‘人员’, ‘收到’, ‘消费’, ‘信息’, ‘就’, ‘在’, ‘几分钟’, ‘前此’, ‘卡’, ‘在’, ‘名品’, ‘商场’, ‘刷’, ‘走’, ‘了’, ‘五千’, ‘零’, ‘三十元’, ‘在’, ‘局里’, ‘坐镇’, ‘指挥’, ‘的’, ‘陆亦可’, ‘让’, ‘张’, ‘华华’, ‘立即’, ‘赶往’, ‘名品’, ‘商场’, ‘在’, ‘第一’, ‘时间’, ‘提取’, ‘这个’, ‘证据’, ‘如果’, ‘发现’, ‘目标’, ‘欧阳菁’, ‘即予’, ‘控制’], [‘张’, ‘华华’, ‘接到’, ‘指示’, ‘奔’, ‘向’, ‘名品’, ‘商场’, ‘商场’, ‘人流’, ‘熙攘’, ‘摩肩接踵’, ‘想’, ‘寻’, ‘个人’, ‘不’, ‘容易’, ‘张’, ‘华华’, ‘让’, ‘手下’, ‘两名’, ‘干警’, ‘在’, ‘一楼’, ‘分头’, ‘搜寻’, ‘自己’, ‘直奔’, ‘二楼’, ‘就’, ‘在’, ‘上楼’, ‘的’, ‘手扶’, ‘电梯’, ‘上’, ‘张’, ‘华华’, ‘蓦地’, ‘发现’, ‘欧阳菁’, ‘提着’, ‘大’, ‘包小包’, ‘从’, ‘对面’, ‘电梯’, ‘上’, ‘下来’, ‘两人’, ‘还’, ‘打了个’, ‘照面’, ‘欧阳菁’, ‘显然’, ‘认出’, ‘了’, ‘她’, ‘立即’, ‘加快步伐’, ‘匆匆’, ‘地下’, ‘了’, ‘下行’, ‘电梯’, ‘急急’, ‘离去’, ‘张’, ‘华华’, ‘一看’, ‘不好’, ‘在’, ‘上行’, ‘电梯’, ‘玩命’, ‘逆行’, ‘推开’, ‘行人’, ‘追出’, ‘大门’, ‘然而’, ‘还是’, ‘晚’, ‘了’, ‘一步’, ‘欧阳菁’, ‘在’, ‘停车场’, ‘上’, ‘了’, ‘自己’, ‘的’, ‘宝马车’, ‘开着车’, ‘近乎’, ‘横冲直撞’, ‘驶往’, ‘大街’], [‘张’, ‘华华’, ‘也’, ‘上’, ‘了’, ‘检察’, ‘警车’, ‘急速’, ‘冲出’, ‘停车场’, ‘同时’, ‘对’, ‘着’, ‘袖珍’, ‘话筒’, ‘向’, ‘陆亦可’, ‘报告’, ‘陆处’, ‘欧阳菁’, ‘认出’, ‘了’, ‘我’, ‘一路’, ‘狂奔’, ‘要’, ‘逃跑’, ‘我’, ‘现在’, ‘已经’, ‘咬住’, ‘了’, ‘她’, ‘可’, ‘我’, ‘只有’, ‘一个’, ‘人’, ‘啊’, ‘我’, ‘手下’, ‘那’, ‘两个’, ‘主儿’, ‘还’, ‘在’, ‘商场’, ‘呢’]]

PS:
现在我们可以直接读分词后的文件到内存。这里使用了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])

输出

0.99965405
0.99958616
李达康 0.99984169006347660.9997967481613159
政治 0.9997952580451965
这位 0.99978756904602050.9997811913490295

2. 找出不匹配的词汇

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

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

3. 计算词汇的词频

# 计算词汇的词频
word_frequency = model.wv.get_vecattr("沙瑞金", "count")
print(f"沙瑞金:{word_frequency}")

沙瑞金:353

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值