1. 程式人生 > >資料轉換Word2Vec和Doc2Vec

資料轉換Word2Vec和Doc2Vec

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('黃河', '長江'))