機器學習20-詞向量(Word2Vec)技術
阿新 • • 發佈:2019-01-11
使用gensim工具包,利用20類新聞文字(20newsgroups)進行詞向量訓練;
並且通過抽樣幾個詞彙,查驗Word2Vec技術是否可以在不借助任何語言學知識的前提下,尋找到相似的其他詞彙。
from sklearn.datasets import fetch_20newsgroups
from bs4 import BeautifulSoup
import nltk, re
from gensim.models import word2vec
#定義一個函式名為news_to_sentences將每條新聞中的句子逐一剝離出來,
#並返回一個句子逐一剝離出來,並返回一個句子列表。
def news_to_sentences(news):
news_text = BeautifulSoup(news).get_text()
tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
raw_sentences = tokenizer.tokenize(news_text)
sentences = []
for sent in raw_sentences:
sentences.append(re.sub('[^a-zA-Z]', ' ', sent.lower().strip()).split())
return sentences
news = fetch_20newsgroups(subset='all')
X, y = news.data, news.target
sentences = []
#將長篇新聞文字中的句子剝離出來,用於訓練。
for x in X:
sentences += news_to_sentences(x)
#配置詞向量的維度。
num_features = 300
#保證被考慮的詞彙的頻度
min_word_count = 20
#設定並行化訓練使用CPU計算核心的數量,多核可用。
num_workers = 2
#定義訓練詞向量的上下文視窗大小
context = 5
downsampling = 1e-3
model = word2vec.Word2Vec(sentences, workers=num_workers,\
size=num_features, min_count=min_word_count,\
window=context, sample=downsampling)
#這個設定代表當前訓練好的詞向量為最終版,也可以加快模型的訓練速度。
model.init_sims(replace=True)
#利用訓練好的模型,尋找訓練文字中與morning最相關的10個詞彙
m = model.most_similar('morning')
print(m)
#out[]:
# [('afternoon', 0.8285419940948486),
# ('weekend', 0.7679079174995422),
# ('evening', 0.7551226615905762),
# ('saturday', 0.7222977876663208),
# ('night', 0.7116754055023193),
# ('friday', 0.6781198978424072),
# ('sunday', 0.6390078067779541),
# ('newspaper', 0.6356056928634644),
# ('summer', 0.6305795907974243),
# ('week', 0.6181687116622925)]
#利用訓練好的模型,尋找訓練文字中與email最相關的10個詞彙。
e = model.most_similar('email')
print(e)
#out[]:
# [('mail', 0.7398847341537476),
# ('contact', 0.6963222622871399),
# ('address', 0.6542695164680481),
# ('replies', 0.646983802318573),
# ('mailed', 0.6348010897636414),
# ('request', 0.632864236831665),
# ('send', 0.6214576959609985),
# ('sas', 0.6191704869270325),
# ('listserv', 0.6177695989608765),
# ('compuserve', 0.5945062041282654)]
通過以上兩組輸出,我們不難發現,在不使用語言學詞典的前提下,詞向量技術仍可以藉助上下文資訊找到詞彙之間的相似性。這一技術不僅節省了大量專業人士的作業時間,而且也可以作為一個基礎模型應用到更加複雜的自然語言處理任務中。