基于10个类别假新闻1000篇文章数据训练中文word2vec模型
爬取语料库
利用爬虫爬取百度网页每个类别假新闻10页,共1000篇文章。爬取的类别如下:
数据预处理
汇总
把爬取到的10个txt文件都放在同一个文件夹下,利用程序将这10个txt文件合并在一起。
把汇总的txt文件命名为result.txt。
程序如下:
file: FileMerage.py
# os模块中包含很多操作文件和目录的函数
import os
# 获取目标文件夹的路径
meragefiledir = os.getcwd() + '\\MerageFiles'
# 获取当前文件夹中的文件名称列表
filenames = os.listdir(meragefiledir)
# 打开当前目录下的result.txt文件,如果没有则创建
file = open('result.txt', 'w')
# 先遍历文件名
for filename in filenames:
filepath = meragefiledir + '\\' + filename
# 遍历单个文件,读取行数
for line in open(filepath):
file.writelines(line)
file.write('\n')
# 关闭文件
file.close()
汇总完后的数据如下:
分词去停
利用jieba分词将得到的result.txt文件进行分词去停。这里使用的停词表是哈工大停词表。
import jieba
stopwords={}.fromkeys([line.rstrip()for line in open('stopword.txt','r',encoding='UTF-8')]) #创建并返回一个新字典,
jieba.add_word('原标题',1)
a=open("result.txt",'r').read()
segs=jieba.cut(a, cut_all=False)
final=''
for seg in segs:
#seg=seg.encode('utf-8')
if seg not in stopwords:
final+=' '+seg
print(final)
fpath='F:/word2vec.txt'
with open(fpath, 'a') as f: # 写入到文本文件中
f.write(str(final) + '\n')
转换完后的数据如下:
训练word2vec
我们用gensim中的word2vec工具训练,在pycharm控制台运行如下命令:
Python train_word2vec_model.py corpus_seg.txt corpus.model corpus.vector
# train_word2vec_model.py用于训练模型
import logging
import os.path
import sys
import multiprocessing
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
if __name__=='__main__':
program = os.path.basename(sys.argv[0]) #os.path.basename表示返回path最后的文件名;sys.argv[0]表示传递命令行参数,参数train_word2vec_model.py为argv[0]
logger = logging.getLogger(program)
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
logging.root.setLevel(level=logging.INFO) ##
logging.info("running %s" % ' '.join(sys.argv)) #info表示打印,Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
if len(sys.argv) < 4:
print (globals()['__doc__'] % locals()) #全局变量,局部变量
sys.exit(1)
inp,outp,outp2 = sys.argv[1:4] #依次表示切割后的文本,模型,向量
model = Word2Vec(LineSentence(inp),size=400,window=5,min_count=5,workers=multiprocessing.cpu_count()) #.window是句子中当前词与目标词之间的最大距离
model.save(outp) #训练后的模型保存;# 以二进制格式存储
model.wv.save_word2vec_format(outp2,binary=False) # 以文本格式存储, 一行是一个词的vector
测试效果
在pycharm中输入python命令。
接着依次输入:
import gensim
model = gensim.models.Word2Vec.load('corpus.model')
result = model.most_similar(u'老人')
for word in result: print (word[0],word[1])
输出如下: