跑实验_word2vector词向量实现_基于搜狗新闻预料+维基百科

这篇博客只是记录一下如何解决 跑别人的代码没通的过程。

1 运行代码

最经在学CS224课程,理论上了解了一个大概,但是仍然没什么感觉,想要跑一跑word2vecd代码,于是在g站找到了下面这个仓库:中文word2vector词向量实现

0设备环境

台式机 AMD 3600X CPU @ 3.80GHz × 12 , 8G RAM

ubuntu18.04LTS 独立系统,
python 3.6.1
依赖:numpy, scipy, gensim, opencc, jieba

1.获取语料库

1.1维基百科【直接下载】
下载地址https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2
原始语料文件:zhwiki-latest-pages-articles.xml.bz2 2.1G

1.2 SogouCA 全网新闻数据(SogouCA)【需要实名获取数据,网络资源也不太好找】
官方下载地址http://www.sogou.com/labs/resource/ca.php
原始语料文件:‘news_tensite_xml.full.tar.gz’ 746.3 M

2.语料库预处理

2.1 搜狗新闻语料处理
来自若干新闻站点2012年6月—7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据,提供URL和正文信息 格式说明: 数据格式为 页面URL 页面ID 页面标题 页面内容 注意:content字段去除了HTML标签,保存的是新闻正文文本

刚下下来的语料是用gbk编码的,在mac或linux上都会呈乱码形式,需要将之转换为utf-8编码。而且我们只需要里面的内容。因此先转换编码和获取content内容

cat news_tensite_xml.dat | iconv -f gbk -t utf-8 -c | grep "" > corpus.sogou.txt

(有的网友可能直接给出了tensite_xml.dat文件,我曾在网盘中见过)
生成 corpus.sogou.txt 1.9 2.2G 分词-用空格隔开 用时40分钟

python3 sogou_corpus_seg.py data/corpus.sogou.txt data/corpus_sogou_seg.txt

生成 corpus_sogou_seg.txt 2.22.6 G

2.2 维基百科语料处理
-gensim解析bz2语料

python3 parse_wiki_xml2txt.py data/zhwiki-latest-pages-articles.xml.bz2 data/corpus.zhwiki.txt

生成 corpus.zhwiki.txt 1.11.4 G 用时40分钟

简繁体转换(opencc) 把语料中的繁体转换成简体 用时1 分钟
我是在conda虚拟环境中安装opencc

sudo apt-get install opencc opencc -i data/corpus.zhwiki.txt -o data/corpus.zhwiki.simplified.txt -c ~~zht2zhs.ini~~
sudo apt-get install opencc opencc -i data/corpus.zhwiki.txt -o data/corpus.zhwiki.simplified.txt -c t2s.json

去除英文和空格 文档中还是有很多英文的,一般是文章的reference。里面还有些日文,罗马文等,这些对模型影响效果可以忽略, 只是简单的去除了空格和英文。用时1分钟
python3 remove_en_blank.py data/corpus.zhwiki.simplified.txt data/corpus.zhwiki.simplified.done.txt

生成 corpus.zhwiki.simplified.done.txt (1.4G)

分词 这里以空格做分割符 -d ’ ’

pip install jieba
python3 -m jieba -d ' ' data/corpus.zhwiki.simplified.done.txt > data/corpus_zhwiki_seg.txt

生成 corpus.zhwiki.seg.txt 1.4G 用时30分钟

2.3 将百科数据和搜狗数据和并到一个文件
用时2分钟
cat data/corpus_zhwiki_seg.txt data/corpus_sogou_seg.txt > data/corpus_seg.txt
此时我的data文件夹:

3.训练

python3 train_word2vec_model.py data/corpus_seg.txt model/word2vec.model model/corpus.vector

详细api参考:http://radimrehurek.com/gensim/models/word2vec.html

生成 word2vec.model 63.6M corpus.vector 4.6G 用时426分钟
就在这一步,每次训练完5个EPOCH我都保存不了模型!!!
报错的代码如下:
TypeError:file must have a ‘write’ attribute
以及
FileNotFoundError:[Errno 2] no such file or directory
在这里插入图片描述
仓库中的保存代码为:
inp为训练数据
outp1为保存可训练的、完整模型的路径
outp2为保存不可再训练的模型的路径

inp, outp1, outp2 = sys.argv[1:4]

    model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5,
                     workers=multiprocessing.cpu_count())

    model.save(outp1)
    model.wv.save_word2vec_format(outp2, binary=False)

    toc = time.process_time()
    print("\nComputation time = " + str((toc - tic)/60) + "min")

我尝试过一下方式:

  • 将读写方式wb修改为w ,因为有一篇文字建议了这中方案,且报错提示对应的文件有个地方写了“wb is needed in windows”【不建议采用这种方式,万一改不回来就麻烦了】
  • 将outp1改成如下形式–使用get_tmpfile函数,oupt2也是这个改法【这个方案开始也是报错no such file,后来可以采用】
from gensim.test.utils import get_tmpfile
path1 = get_tmpfile(outp1)
model.save(path1)
  • 使用绝对路经:直接写
oupt1 = "/home/USERNAME/Downloads/word2vector-master/model/word2vec.model"

然而上面的方法都不奏效。

痛定思痛,找来外援。
原先的代码都是在Terminal运行,后来改完之后,能够在pycharm中使用run debug来运行,修改后主体代码如下:

if __name__ == '__main__':
    tic = time.process_time()
    program = os.path.basename('train_word2vec_model.py')
    logger = logging.getLogger(program)

    logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
    logging.root
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值