制作百科词向量

参考大佬:https://zhuanlan.zhihu.com/p/40016964
但是可能里面的库经过更新,目前出现了一些错误,经过网上搜索后,总结一下。

分为如下步骤:

  1. 下载
  2. WikiExtractort提取
  3. 繁体文转化为简体文
  4. 分词
  5. 训练模型(获得词向量)
  6. 测试

1.下载

网址如下:https://dumps.wikimedia.org/zhwiki/,具体可见最开始的那个网站,很好的!!!

下载后得到的文件如下:
在这里插入图片描述


2.WikiExtractort提取

2.1 准备WikiExtractort代码

WikiExtractort.py文件复制到项目下

2.2 使用WikiExtractort.py文件

    python WikiExtractor.py -b 100M -o 输出文件存放路径 语料存放路径
    
    # -b 以100M为单位进行切分,有时候可能语料太大,我们可能需要切分成几个小的文件(默认)。这里我只是用到过存放到一个文件中(因为文件不大),如果需要多个文件,百度查查!!!

假设下载的文件1节中的那个,并且输出的文件名为wiki_00

python WikiExtractor.py -b 500M -o zhwiki-20220820-pages-articles-multistream1.xml-p1p187712.bz2 wiki_00

最终你翻翻文件夹,可以找到wiki_00文件(找新产生的文件夹就行,之前我删除了,忘了名字,又懒得重新提取)

最终生成的文件如下:

在这里插入图片描述

2.3 错误1

Wikiextractor.py运行出现.extractor不存在的问题!!!

将下面这行的内容更换:

更换前

from .extract import Extractor, ignoreTag, define_template, acceptedNamespaces

更换后

from wikiextractor.extract import Extractor,ignoreTag,define_template,acceptedNamespaces

其实就是加了一个wikiextractor

3.繁体文转化为简体文

使用的opencc

3.1 安装opencc

下载安装包后解压即可

3.2 文件结构

解压后,结构如下
在这里插入图片描述
其中最重要的就是红框标出来的两个内容:

1.bin:这里是opencc的启动文件。
2.share:里面是opencc语言转换的配置文件,在这个文件夹你能找到下面的这些文件。

在这里插入图片描述

3.3 使用

因为我们要运行opencc的exe文件,可以配置一下环境变量,但是后面写命令的时候配置文件仍然需要绝对路径。

首先,进入项目文件打开一个终端。然后,使用opencc命令

opencc -i 需要转换的文件路径 -o 转换后的文件路径 -c 配置文件路径

假设我需要转换得文件就在项目文件夹内,名为wiki_00,转换后的文件名为zhwiki_jian_zh.txt,因为我们是繁体转中文,所以配置文件名是t2s.json,我将这个文件移动到了项目下。因此,命令如下

opencc -i wiki_00 -o zhwiki_jian_zh.txt -c t2s.json

在这里插入图片描述
解压后文件及内容(下载的东西不一样,内容会不同)大概如下

4.分词

用的就是上面那个大佬文章的代码,如果缺少什么依赖库,下载就行:

import jieba.analyse
import codecs

#以写的方式打开原始的简体中文语料库
f=codecs.open('zhwiki_jian_zh.txt','r',encoding="utf8")
#将分完词的语料写入到wiki_jian_zh_seg-189.5.txt文件中
target = codecs.open("wiki_jian_zh_seg-189.5.txt", 'w',encoding="utf8")

print('open files')
line_num=1
line = f.readline()

#循环遍历每一行,并对这一行进行分词操作
#如果下一行没有内容的话,就会readline会返回-1,则while -1就会跳出循环
while line:
    print('---- processing ', line_num, ' article----------------')
    line_seg = " ".join(jieba.cut(line))
    target.writelines(line_seg)
    line_num = line_num + 1
    line = f.readline()

#关闭两个文件流,并退出程序
f.close()
target.close()
exit()

修改输入文件路径和输出和文件路径就行

结果如下,可以与3.3节的结果图做个对比

在这里插入图片描述

5.训练分词

5.1 LineSentence(file_path)

from gensim.models.word2vec import LineSentence

sentences = LinSentence("file_path")

通过效果来看,作用将file_path路径下的文件内容一行行读取。

5.2 Word2Vec

from gensim.models import Word2Vec

    '''
    sentences:格式简单:一句话=一行; 单词已经过预处理并被空格分隔
    size:是每个词的向量维度
    window:是词向量训练时的上下文扫描窗口大小,窗口为5就是考虑前5个词和后5个词
    min-count:设置最低频率,默认是5,如果一个词语在文档中出现的次数小于5,那么就会丢弃
    workers:是训练的进程数(需要更精准的解释,请指正),默认是当前运行机器的处理器核数。这些参数先记住就可以了
    sg ({0, 1}, optional) – 模型的训练算法: 1: skip-gram; 0: CBOW
    alpha (float, optional) – 初始学习率
    iter (int, optional) – 迭代次数,默认为5
    '''
model = Word2Vec(指定上述参数)

5.3 model.save

model为5.2创建的word2vec模型

作用是存储模型

model.save("output_model_path")  # 将模型保存到指定路径下

# output_file_path: 后缀名为model,如path.model

5.4 model.wv.save_word2vec_format

作用是存储词向量

model.wv.save_word2vec_format("output_voc_path", binary=False)

# output_voc_path: 后缀名为vector,如path.vector

5.5 实例

import os
import sys
import logging
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
import multiprocessing


if __name__ == "__main__":
    program = os.path.basename(sys.argv[0])
    # print(program)  # word2vec_model.p
    logger = logging.getLogger(program)
    logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
    logging.root.setLevel(level=logging.INFO)
    logger.info("running %s" % ' '.join(sys.argv))
    if len(sys.argv) < 4:
        print(globals()['__doc__'] % locals())
        sys.exit(1)
    inp, outp1, outp2 = sys.argv[1: 4]
    model = Word2Vec(sentences=LineSentence(inp), vector_size=500, window=5, min_count=5, workers=multiprocessing.cpu_count())
    model.save(outp1)
    model.wv.save_word2vec_format(outp2, binary=False)  # 不以C语言可以解析的形式存储词向量

就是上面大佬的代码!!!

保存的词向量如下:

在这里插入图片描述

这个才是我们后面训练需要的东西

6.测试

6.1 Word2Vec.load

作用是下载模型

model = Word2Vec.load('model_path')

# model_path: 后缀名为model的文件

6.2 预测函数

类似于model.wv.most_similar的函数,下面这个网站有用法https://www.jb51.net/article/164661.htm

https://www.jb51.net/article/164661.htm

这里有一定的区别,以most_similar为例,网站里的代码是这样使用的

model.most_similar(u"key", topn=20)

但是在我这里这样用会提示找不到most_similar。经过百度,most_similar函数由model中的wv模块调用,因此应该如下

model.vw.most_similar(u"key", topn=20)

https://www.jb51.net/article/164661.htm

这里有一定的区别,以most_similar为例,网站里的代码是这样使用的

model.most_similar(u"key", topn=20)

但是在我这里这样用会提示找不到most_similar。经过百度,most_similar函数由model中的wv模块调用,因此应该如下

model.vw.most_similar(u"key", topn=20)

如果其他函数有类似错误,可以加vw试试!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白三点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值