【NLP】维基百科中文数据训练word2vec词向量模型——基于gensim库

2023-11-10

前言

  本篇主要是基于gensim 库中的 Word2Vec 模型,使用维基百科中文数据训练word2vec 词向量模型,大体步骤如下:

  • 数据预处理
  • 模型的训练
  • 模型的测试

准备条件:

  • Windows10 64位
  • Python3.6,并安装 gensim 库:pip install gensim
  • 数据集:下载地址

注意:

  • 下载 zhwiki-latest-pages-articles-multistream.xml.bz2 此类型的,其中包括:articles 以及后缀为 xml.bz2
  • 尽可能下载大一点的,我下载的是1.7G的,语料库越大,模型的效果会比较好

我这里下载的是opencc-1.0.1-win64.7z,下载后解压备用即可,解压后得到文件夹:opencc-1.0.1-win64

本篇所有脚本代码可见:Github

其中提供了脚本文件和 opencc 工具包,由于数据比较大,所以这里我没有上传,可以自行下载训练模型。

一、数据预处理

下载后的数据如下:
在这里插入图片描述

1、将下载后的数据转为txt 文本文件
  • 这里只需要使用写好的 python 脚本文件执行即可,此步骤大概需要20分钟左右,根据个人电脑配置。

python 脚本文件可见: process.py

执行语句:

python process.py zhwiki-latest-pages-articles.xml.bz2 wiki_zh.txt
#python 原数据的文件名 转换后数据的文件名
#中间为空格

执行后得到:

在这里插入图片描述

2、繁体转简体

打开 wiki_zh.txt 文件看看:

  • 由于文件比较大,所以一般文本编辑器很难打开,我们可以写个 python 脚本来读取部分内容。

python 脚本文件可见: read_file.py

执行语句:

python read_file.py

脚本代码如下:

import codecs

f = codecs.open('wiki_zh.txt', 'r', encoding="utf8")  # 这里打开哪个文件就改为哪个文件的文件名
line = f.readline()
print(line)

运行结果如下:

在这里插入图片描述

文件中都是繁体中文,所以我们需要将其转换为简体中文,这时候 opencc 就派上用场了

繁体转简体:

  • wiki_zh.txt 文件移到 opencc解压后的文件夹 opencc-1.0.1-win64 下,执行如下语句:
opencc -i wiki_zh.txt -o wiki_zh_jian.txt -c t2s.json

此步骤大概需要几分钟的时间,我的花了大概1分钟

执行后结果为:
在这里插入图片描述

查看内容:

  • 同样使用 read_file.py 脚本文件查看,需要修改文件名。

在这里插入图片描述

此时我们发现,文本文件中已经都是简体中文了,接下来我们要对该文本进行分词操作

3、jieba 分词
  • 使用写好的 python 脚本文件执行即可

python 脚本文件可见: jieba_cut.py

执行语句:

python jieba_cut.py

此步骤我花了大概十几分钟

执行结果:

在这里插入图片描述

查看内容:

  • 同样的方式

在这里插入图片描述

此时,我们就已经分好词了,至此我们数据预处理就做好了,下面就开始模型训练了

二、模型的训练

  • 使用写好的 python 脚本文件执行即可

python 脚本文件可见: word2vec_model.py

执行语句:

python word2vec_model.py wiki_zh_jian_cut.txt wiki_zh.model wiki_zh.vector

此步骤我花了一个多小时

执行结果:

在这里插入图片描述

模型训练好了,我们可以来试试这个模型怎么样了

三、模型的测试

  • 执行脚本文件 test_model.py

测试代码:

from gensim.models import Word2Vec

en_wiki_word2vec_model = Word2Vec.load('wiki.zh.text.model')

testwords = ['苹果', '数学', '学术', '白痴', '篮球']
for i in range(5):
    res = en_wiki_word2vec_model.most_similar(testwords[i])
    print(testwords[i])
    print(res)

执行语句:

python test_model.py

运行结果:

在这里插入图片描述

从上面的结果看来:

  • 和“数学”词向量比较相近的词还真是,都是和“数学”有关的,其他词也是,说明这个模型还不错,给自己一个赞吧

四、总结

  从上面的试验看来,应用维基百科的中文数据来训练模型还不错,要是我们有更好的语料库,或者更大的语料库,那模型的效果会不会更好呢?理论上是肯定的,我们可以将任何语料库提取、转换、分词后(当然,这些步骤不是每步都是必须的,但是分词是必须的),然后应用 gensim 库中的 Word2vec 模块进行训练。细心的朋友可能发现,现在有很多的分词工具(这里用的jieba,另外还有北大开源的 pkuseg,可参考:链接),那么分词的好坏会不会带来模型效果的提升呢?这也待进一步试验。我想分词结果越好,模型效果也越好吧。

  另外,词向量的构建仅是自然语言处理中的一个强大的工具,我们还需要对构建好的词向量加以应用,用来处理自然语言处理的或许工作,如:词性标注、主题分类等等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【NLP】维基百科中文数据训练word2vec词向量模型——基于gensim库 的相关文章

  • Spacy 中的自定义句子分割

    I want spaCy使用我提供的句子分割边界而不是它自己的处理 例如 get sentences Bob meets Alice SentBoundary They play together gt Bob meets Alice Th
  • 将单引号替换为双引号并排除某些元素

    我想用双引号替换字符串中的所有单引号 但出现的情况除外 例如 n t ll m 等 input the stackoverflow don t said hey what output the stackoverflow don t sai
  • BERT 输出不确定

    BERT 输出是不确定的 当我输入相同的输入时 我希望输出值是确定性的 但我的 bert 模型的值正在变化 听起来很尴尬 同一个值返回两次 一次 也就是说 一旦出现另一个值 就会出现相同的值并重复 如何使输出具有确定性 让我展示我的代码片段
  • gensim如何计算doc2vec段落向量

    我正在看这篇论文http cs stanford edu quocle paragraph vector pdf http cs stanford edu quocle paragraph vector pdf 它指出 段落向量和词向量被平
  • 是否可以使用 Google BERT 来计算两个文本文档之间的相似度?

    是否可以使用 Google BERT 来计算两个文本文档之间的相似度 据我了解 BERT 的输入应该是有限大小的句子 一些作品使用 BERT 来计算句子的相似度 例如 https github com AndriyMulyar semant
  • NLTK 中的 wordnet lemmatizer 不适用于副词 [重复]

    这个问题在这里已经有答案了 from nltk stem import WordNetLemmatizer x WordNetLemmatizer x lemmatize angrily pos r Out 41 angrily 这是 nl
  • 如何提取句子中的主语及其各自的从属短语?

    我正在尝试在句子中进行主题提取 以便我能够根据主题获得情感 我在用nltk在 python2 7 中用于此目的 以下面的句子为例 Donald Trump is the worst president of USA but Hillary
  • 如何将标记化中的多单词名称保留在一起?

    我想使用 TF IDF 特征对文档进行分类 一种方法是 from sklearn feature extraction text import TfidfVectorizer import string import re import n
  • 举例解释bpe(字节对编码)?

    有人可以帮忙解释一下背后的基本概念吗BPE模型 除了这张纸 https arxiv org abs 1508 07909 目前还没有那么多解释 到目前为止我所知道的是 它通过将罕见和未知的单词编码为子词单元序列来实现开放词汇表上的 NMT
  • 除非 POS 显式,否则 WordNetLemmatizer 不会返回正确的引理 - Python NLTK

    我正在对 Ted 数据集成绩单进行词形还原 我注意到一些奇怪的事情 并非所有单词都被词形还原 要说的是 selected gt select 哪个是对的 然而 involved gt involve and horsing gt horse
  • 如何使用动词时态/语气制作稀疏匹配器模式?

    我一直在尝试使用动词时态和情绪为 spacy 匹配器创建一个特定的模式 我发现了如何使用 model vocab morphology tag map token tag 访问使用 spacy 解析的单词的形态特征 当动词处于虚拟语气模式
  • Keras:嵌入/向量的附加层?

    我有 3 个词嵌入 嵌入 1 w11 w12 w13 w14 嵌入 2 w21 w22 w23 w24 嵌入 3 w31 w32 w33 w34 有没有办法通过添加所有三个向量来获得第四个嵌入 并使用所有向量的可训练权重 例如 嵌入 4 w
  • Java 中的自然语言处理 (NLP) [重复]

    这个问题在这里已经有答案了 可能的重复 Java 有没有好的自然语言处理库 https stackoverflow com questions 870460 java is there a good natural language pro
  • spacy 如何使用词嵌入进行命名实体识别 (NER)?

    我正在尝试使用以下方法训练 NER 模型spaCy识别位置 人 名和组织 我试图理解如何spaCy识别文本中的实体 但我无法找到答案 从这个问题 https github com explosion spaCy issues 491在 Gi
  • Python NLP 英式英语与美式英语

    我目前正在用Python 进行NLP 工作 然而 在我的语料库中 既有英式英语也有美式英语 实现 实现 我正在考虑将英式英语转换为美式英语 但是 我没有找到一个好的工具 包来做到这一点 有什么建议么 我也找不到包 但试试这个 请注意 我必须
  • 如何使用WordNet或与wordnet相关的类别来实现基于类别的文本标记?

    如何使用wordnet按单词类别标记文本 java作为接口 Example 考虑以下句子 1 计算机需要键盘 显示器 CPU才能工作 2 汽车使用齿轮和离合器 现在我的目标是 例句必须标记为 第 1 句话 电脑 电子键盘 电子中央处理器 电
  • 在Python中表示语料库句子的一种热门编码

    我是 Python 和 Scikit learn 库的初学者 我目前需要从事一个 NLP 项目 该项目首先需要通过 One Hot Encoding 来表示一个大型语料库 我已经阅读了 Scikit learn 关于 preprocessi
  • 池化与随时间池化

    我从概念上理解最大 总和池中发生的情况作为 CNN 层操作 但我看到这个术语 随时间变化的最大池 或 随时间变化的总和池 例如 用于句子分类的卷积神经网络 https arxiv org pdf 1408 5882 pdfYoon Kim
  • 如何在 bertopic 建模中获取每个主题的所有文档

    我有一个数据集并尝试使用 berTopic 建模将其转换为主题 但问题是 我无法获取主题的所有文档 berTopic 每个主题仅返回 3 个文档 topic model BERTopic verbose True embedding mod
  • NLTK 2.0分类器批量分类器方法

    当我运行此代码时 它会抛出一个错误 我认为这是由于 NLTK 3 0 中不存在batch classify 方法 我很好奇如何解决旧版本中的某些内容在新版本中消失的此类问题 def accuracy classifier gold resu

随机推荐