【学习笔记】维基百科中文数据处理(NLP)
发布时间:2020-12-14 04:52:07 所属栏目:大数据 来源:网络整理
导读:? ? ?本文简单记录一下初学NLP的一个小例子,NLP需要使用语料库进行训练,本文使用维基百科的中文数据进行训练,下载地址在:https://dumps.wikimedia.org/zhwiki/20171020/,我下载的是比较大的,训练效果也更好。 ? ? ? 下载下来后的文件是xml.gz格式的,
? ? ?本文简单记录一下初学NLP的一个小例子,NLP需要使用语料库进行训练,本文使用维基百科的中文数据进行训练,下载地址在:https://dumps.wikimedia.org/zhwiki/20171020/,我下载的是比较大的,训练效果也更好。 ? ? ? 下载下来后的文件是xml.gz格式的,需要先用维基百科提供的process.py转换为文本文件,该代码可以在维基百科上下载,这里把它贴出来: #!/usr/bin/env python # -*- coding: utf-8 -*- # 修改后的代码如下: import logging import os.path import sys from gensim.corpora import WikiCorpus if __name__ == '__main__': program = os.path.basename(sys.argv[0]) 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)) # check and process input arguments if len(sys.argv) < 3: print (globals()['__doc__'] % locals()) sys.exit(1) inp,outp = sys.argv[1:3] space = b' ' i = 0 output = open(outp,'w',encoding='utf-8') wiki = WikiCorpus(inp,lemmatize=False,dictionary={}) for text in wiki.get_texts(): s=space.join(text) s=s.decode('utf8') + "n" output.write(s) i = i + 1 if (i % 10000 == 0): logger.info("Saved " + str(i) + " articles") output.close() logger.info("Finished Saved " + str(i) + " articles") #python process.py zhwiki-latest-pages-articles.xml.bz2 wiki.zh.text? ? 经过处理后的生成的文本文档是繁体中文的,需要转换为简体中文,这里使用OpenCC库,下载地址在:https://bintray.com/package/files/byvoid/opencc/OpenCC,找到对应平台的安装包找帮助使用即可。 ? ? ? 转换后的文本还需要进行分词,这里使用Python jieba分词,直接pip install jieba即可安装。分词代码: import jieba import jieba.analyse import jieba.posseg as pseg import codecs,sys def cut_words(sentence): #print sentence return " ".join(jieba.cut(sentence)).encode('utf-8') f=codecs.open('wiki.zh.jian.text','r',encoding="utf8") target = codecs.open("zh.jian.wiki.seg-1.3g.txt",encoding="utf8") print ('open files') line_num=1 line = f.readline() 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() while line: curr = [] for oneline in line: #print(oneline) curr.append(oneline) after_cut = map(cut_words,curr) target.writelines(after_cut) print ('saved','articles') exit() line = f.readline1() f.close() target.close() # python Testjieba.py? ?分词后的文本类似于: 欧几里得 西元前 三 世纪 的 希腊 数学家 现在 被 认为 是 几何 之 父 此画 为 拉斐尔 的 作品 雅典 学院 数学 ? ? 将文本使用gensim word2Vec训练即可,安装gensim也简单,直接pip install,训练代码如下: import logging import os.path import sys import multiprocessing from gensim.corpora import WikiCorpus from gensim.models import Word2Vec from gensim.models.word2vec import LineSentence if __name__ == '__main__': program = os.path.basename(sys.argv[0]) 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)) # check and process input arguments if len(sys.argv) < 4: print (globals()['__doc__'] % locals()) sys.exit(1) 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.model.wv.save_word2vec_format(outp2,binary=False) #python word2vec_model.py zh.jian.wiki.seg.txt wiki.zh.text.model wiki.zh.text.vector #opencc -i wiki_texts.txt -o test.txt -c t2s.json? ? 训练很费时间,训练完成后即可进行相似度匹配,代码如下: ? ? ? from gensim.models import Word2Vec en_wiki_word2vec_model = Word2Vec.load('wiki.zh.text.model') testwords = ['苹果','数学','学术','白痴','篮球'] for i in range(5): res = en_wiki_word2vec_model.most_similar(testwords[i]) print (testwords[i]) print (res) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |