小專案(Gensim庫)--維基百科中文資料處理
阿新 • • 發佈:2018-11-04
1.下載維基百科資料
https://dumps.wikimedia.org/zhwiki/latest/
2.預處理檔案:將壓縮的檔案轉化成.txt檔案
新增指令碼檔案process.py,程式碼如下:
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.zh1.text
3.檔案內容是繁體,我們轉化成簡體(用工具opencc,找到自己對應的版本下載)
步驟1:將要轉化的.txt檔案複製到opencc-1.0.1-win64目錄下
步驟2:cmd中進入你的opencc-1.0.1-win64目錄
步驟3:輸入命令opencc -i wiki_texts.txt -o test.txt -c t2s.json
其中wiki_texts.txt是你原始的檔名,test.txt是改成簡體的檔案的檔名
步驟4:將test.txt檔案再拷貝到你的python環境中
4.開啟看看是不是已經是簡體中文形式(速度可能比較慢,耐心等待)
5.將簡體檔案進行分詞
新增指令碼檔案Testjieba.py,程式碼如下:
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", 'w',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',line_num,'articles') exit() line = f.readline1() f.close() target.close()
執行指令碼檔案
python Testjieba.py
6.word2vec建模
新增指令碼檔案word2vec_model.py,程式碼如下:
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())
#min_count=5表示去除出現次數小於5的詞;size=400設定神經網路的層數
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
#zh.jian.wiki.seg.txt分詞好的檔名;wiki.zh.text.model建立模型的名字;wiki.zh.text.vector生成的向量的名字
注:這裡用的是神經網路模型,要求生成的向量:相近的詞的詞向量是相似的
7.簡單測試一下
在test.py新增如下程式碼,並執行
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)
注:語料庫越大效果越好