中文文本在訓(xùn)練詞向量的相關(guān)操作和使用的函數(shù)工具總結(jié)
只保留中文字符(數(shù)字、字母)
判斷漢字、數(shù)字和字母的函數(shù)
#是否是漢語判讀
def is_chinese(uchar):
"""判斷一個unicode是否是漢字"""
if uchar >= u'\u4e00' and uchar <= u'\u9fa5':
return True
else:
return False
#是否是數(shù)字判斷
def is_number(uchar):
"""判斷一個unicode是否是數(shù)字"""
if uchar >= u'\u0030' and uchar <= u'\u0039':
return True
else:
return False
#是否是英文字符判斷
def is_alphabet(uchar):
"""判斷一個unicode是否是英文字母"""
if (uchar >= u'\u0041' and uchar <= u'\u005a') or (uchar >= u'\u0061' and uchar <= u'\u007a'):
return True
else:
return False
使用上述三種函數(shù)可以實現(xiàn)對字符串進行篩選的處理,該函數(shù)輸入待處理的字符串,返回清洗后的字符串
def format_str(content):
content_str = ''
for i in content:
if is_chinese(i):#or is_number(i) or is_alphabet(i):
content_str = content_str+i
return content_str
分詞去停用詞
cut_word傳入一個文檔,文檔中每個句子占一行,輸出是分詞并且去除停用詞之后的文檔
def stopwordslist(filepath):
stopwords = [line.strip() for line in open(filepath, 'rb').readlines()]
return stopwords
def cut_word():
stop_words = stopwordslist(stop_word_path)
corpus = ''
temp = 0
with open("./word2vec_data.txt",'r',encoding='utf-8') as f:
documents = f.readlines()
for document in tqdm(documents):
document = document.replace("\n","")
document_cut = jieba.cut(document, cut_all=False)
# print('/'.join(document_cut))\
result = ""
for item in tqdm(document_cut):
if(item not in stop_words):
result += item;
corpus += result+"\n"
# print(result)
#分好詞之后的數(shù)據(jù)
with open('./corpus.txt', 'w+', encoding='utf-8') as f:
f.write(corpus) # 讀取的方式和寫入的方式要一致
gensim中word2vec進行詞向量訓(xùn)練
# -*- coding: utf-8 -*-
from gensim.models import word2vec
import logging
##訓(xùn)練word2vec模型
# 獲取日志信息
logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s', level=logging.INFO)
# 加載分詞后的文本,使用的是Text8Corpus類
sentences = word2vec.Text8Corpus(r'./corpus.txt')
# 訓(xùn)練模型,部分參數(shù)如下
model = word2vec.Word2Vec(sentences, size=100, hs=1, min_count=1, window=3)
# 模型的預(yù)測
print('-----------------分割線----------------------------')
# 計算兩個詞向量的相似度
try:
sim1 = model.similarity(u'中央企業(yè)', u'事業(yè)單位')
sim2 = model.similarity(u'教育網(wǎng)', u'新聞網(wǎng)')
except KeyError:
sim1 = 0
sim2 = 0
print(u'中央企業(yè) 和 事業(yè)單位 的相似度為 ', sim1)
print(u'人民教育網(wǎng) 和 新聞網(wǎng) 的相似度為 ', sim2)
print('-----------------分割線---------------------------')
# 與某個詞(李達康)最相近的3個字的詞
print(u'與國資委最相近的3個字的詞')
req_count = 5
for key in model.similar_by_word(u'國資委', topn=100):
if len(key[0]) == 3:
req_count -= 1
print(key[0], key[1])
if req_count == 0:
break
print('-----------------分割線---------------------------')
# 計算某個詞(侯亮平)的相關(guān)列表
try:
sim3 = model.most_similar(u'新華社', topn=20)
print(u'和 新華社 與相關(guān)的詞有:\n')
for key in sim3:
print(key[0], key[1])
except:
print(' error')
print('-----------------分割線---------------------------')
# 找出不同類的詞
sim4 = model.doesnt_match(u'新華社 人民教育出版社 人民郵電出版社 國務(wù)院'.split())
print(u'新華社 人民教育出版社 人民郵電出版社 國務(wù)院')
print(u'上述中不同類的名詞', sim4)
print('-----------------分割線---------------------------')
# 保留模型,方便重用
model.save(u'word2vec.model')