语料库
使用搜狗实验室12年的全网新闻数据。
选择相应的下载包,注册搜狗的下载用户就可以下载了。
注册后,搜狗会生成相应的用户名和密码供下载使用。
原始文件大概700M左右,解压以后大概1.5GB
将其解压后得到news_tensite_xml.dat文件
tar -zxvf news_tensite_xml.full.tar.gz
或
unzip news_tensite_xml.full.zip
处理语料库
解压后得到的文件是用gbk编码的,同时文件使用xml格式,包含大量对我们来说没有用的信息。
cat news_tensite_xml.dat | iconv -f gbk -t utf-8 -c | grep "<content>" | sed 's\<content>\\' | sed 's\</content>\\' > news.txt
将原始数据过滤后,得到中间的新闻文本,将其输出到news.txt 文件中。
分词
分词采用jieba分词工具
i=0
for line in f.readlines():
i = i + 1
sentences.append(jieba.cut(line.strip()))
if(i%500 == 0):
print('writing')
for sentence in sentences:
out.write(" ".join(sentence) + "\n")
out.flush()
print('writing ending!')
sentences = []
f = open(filepath2,'w')
for sentence in sentences:
f.write(" ".join(sentence) + "\n")
这样整个文件就每行一条新闻,每条新闻都按空格分隔。整个分词的过程可能比较慢。
加载数据,word2vec训练
word2vec的训练使用gensim,使用默认的参数进行训练。
class MySentences(object):
def __init__(self, filename):
self.filename = filename
def __iter__(self):
for line in open(self.filename):
yield line.split()
sentences = MySentences(filename)
model = gensim.models.Word2Vec(sentences)
# save model
model.save(filepath)
因为训练的数据比较多,所以不建议使用一次加载所有数据的方法,使用python中自带的产生器yield,以挤牙膏的方式,减少内存的占用率。整个训练过程大概需要几十分钟(因个人电脑配置而定)
测试
import gensim, logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
model = gensim.models.Word2Vec.load(filepath)
print(model.most_similar('电脑'))