参考大佬:https://zhuanlan.zhihu.com/p/40016964
但是可能里面的库经过更新,目前出现了一些错误,经过网上搜索后,总结一下。
分为如下步骤:
- 下载
WikiExtractort
提取- 繁体文转化为简体文
- 分词
- 训练模型(获得词向量)
- 测试
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
![5.png](https://ucc.alicdn.com/pic/developer-ecology/y4hik5jbsrqr6_9be7b3f89fcc498cb7a95909eec9ae81.png)
解压后文件及内容(下载的东西不一样,内容会不同)大概如下
# 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节的结果图做个对比**
![6.png](https://ucc.alicdn.com/pic/developer-ecology/y4hik5jbsrqr6_c15cc04a694f4bf0ada694db52d635f4.png)
# 5.训练分词
### 5.1 `LineSentence(file_path)`
```python
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试试!!!