資料轉換Word2Vec和Doc2Vec
阿新 • • 發佈:2018-11-30
Gensim 構建詞袋模型
import jieba #定義停用詞、標點符號 punctuation = [",","。",":", ";", "?"] #定義語料 content = ["機器學習帶動人工智慧飛速的發展。", "深度學習帶動人工智慧飛速的發展。", "機器學習和深度學習帶動人工智慧飛速的發展。" ] #分詞 segs_1 = [jieba.lcut(con) for con in content] # 去停用詞和標點符號 tokenized = [] for sentence in segs_1: words = [] for word in sentence: if word not in punctuation: words.append(word) tokenized.append(words) #求並集 bag_of_words = [ x for item in segs_1 for x in item if x not in punctuation] #去重 bag_of_words = list(set(bag_of_words)) bag_of_word2vec = [] for sentence in tokenized: tokens = [1 if token in sentence else 0 for token in bag_of_words ] bag_of_word2vec.append(tokens) from gensim import corpora import gensim #tokenized是去標點之後的 dictionary = corpora.Dictionary(tokenized) # 儲存詞典 dictionary.save('deerwester.dict') # 檢視詞典和下標 id 的對映 print(dictionary.token2id) corpus = [dictionary.doc2bow(sentence) for sentence in segs_1] print(corpus)
執行結果如下:
{‘人工智慧’: 0, ‘發展’: 1, ‘學習’: 2, ‘帶動’: 3, ‘機器’: 4, ‘的’: 5, ‘飛速’: 6, ‘深度’: 7, ‘和’: 8}
稀疏向量結果如下:
[[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1)], [(0, 1), (1, 1), (2, 1), (3, 1), (5, 1), (6, 1), (7, 1)], [(0, 1), (1, 1), (2, 2), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1), (8, 1)]]
詞向量模型 Word2Vec
from gensim.models import Word2Vec import jieba #定義停用詞、標點符號 punctuation = [",", "。", ":", ";", ".", "'", '"', "’", "?", "/", "-", "+", "&", "(", ")"] sentences = [ "長江是中國第一大河,幹流全長6397公里(以沱沱河為源),一般稱6300公里。流域總面積一百八十餘萬平方公里,年平均入海水量約九千六百餘億立方米。以幹流長度和入海水量論,長江均居世界第三位。", "黃河,中國古代也稱河,發源於中華人民共和國青海省巴顏喀拉山脈,流經青海、四川、甘肅、寧夏、內蒙古、陝西、山西、河南、山東9個省區,最後于山東省東營墾利縣注入渤海。幹流河道全長5464千米,僅次於長江,為中國第二長河。黃河還是世界第五長河。", "黃河,是中華民族的母親河。作為中華文明的發祥地,維繫炎黃子孫的血脈.是中華民族民族精神與民族情感的象徵。", "黃河被稱為中華文明的母親河。公元前2000多年華夏族在黃河領域的中原地區形成、繁衍。", "在蘭州的“黃河第一橋”內蒙古托克托縣河口鎮以上的黃河河段為黃河上游。", "黃河上游根據河道特性的不同,又可分為河源段、峽谷段和沖積平原三部分。 ", "黃河,是中華民族的母親河。" ] # 分詞,去標點符號、停用詞 sentences = [jieba.lcut(sen) for sen in sentences] tokenized = [] for sentence in sentences: words = [] for word in sentence: if word not in punctuation: words.append(word) tokenized.append(words) # 進行模型訓練 model = Word2Vec(tokenized, sg=1, size=100, window=5, min_count=2, negative=1, sample=0.001, hs=1, workers=4) model.save('model') #儲存模型 model = Word2Vec.load('model') #載入模型 print(model.similarity(u'黃河', u'長江')) print(model.most_similar(positive=[u'黃河', u'母親河'], negative=[u'長江']))
將詞變成詞向量的工具:Doc2Vec
import jieba
#定義停用詞、標點符號
punctuation = [",", "。", ":", ";", ".", "'", '"', "’", "?", "/", "-", "+", "&", "(", ")"]
sentences = [
"長江是中國第一大河,幹流全長6397公里(以沱沱河為源),一般稱6300公里。流域總面積一百八十餘萬平方公里,年平均入海水量約九千六百餘億立方米。以幹流長度和入海水量論,長江均居世界第三位。",
"黃河,中國古代也稱河,發源於中華人民共和國青海省巴顏喀拉山脈,流經青海、四川、甘肅、寧夏、內蒙古、陝西、山西、河南、山東9個省區,最後于山東省東營墾利縣注入渤海。幹流河道全長5464千米,僅次於長江,為中國第二長河。黃河還是世界第五長河。",
"黃河,是中華民族的母親河。作為中華文明的發祥地,維繫炎黃子孫的血脈.是中華民族民族精神與民族情感的象徵。",
"黃河被稱為中華文明的母親河。公元前2000多年華夏族在黃河領域的中原地區形成、繁衍。",
"在蘭州的“黃河第一橋”內蒙古托克托縣河口鎮以上的黃河河段為黃河上游。",
"黃河上游根據河道特性的不同,又可分為河源段、峽谷段和沖積平原三部分。 ",
"黃河,是中華民族的母親河。"
]
# 分詞,去標點符號、停用詞
sentences = [jieba.lcut(sen) for sen in sentences]
tokenized = []
for sentence in sentences:
words = []
for word in sentence:
if word not in punctuation:
words.append(word)
tokenized.append(words)
# 定義資料預處理類,作用是給每個文章新增對應的標籤
from gensim.models.doc2vec import Doc2Vec,LabeledSentence
doc_labels = ["長江","黃河","黃河","黃河","黃河","黃河","黃河"]
class LabeledLineSentence(object):
def __init__(self, doc_list, labels_list):
self.labels_list = labels_list
self.doc_list = doc_list
def __iter__(self):
for idx, doc in enumerate(self.doc_list):
yield LabeledSentence(words=doc,tags=[self.labels_list[idx]])
iter_data = LabeledLineSentence(tokenized, doc_labels)
model = Doc2Vec(dm=1, size=100, window=8, min_count=5, workers=4)
model.build_vocab(iter_data)
model.train(iter_data,total_examples=model.corpus_count,epochs=1000,start_alpha=0.01,end_alpha =0.001)
# 根據標籤找最相似的,這裡只有黃河和長江,所以結果為長江,並計算出了相似度
print(model.docvecs.most_similar('黃河'))
print(model.docvecs.similarity('黃河', '長江'))