使用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 sentencesnews = fetch_20newsgroups(subset='all')
X, y = news.data, news.targetsentences = []
#将长篇新闻文本中的句子剥离出来,用于训练。
for x in X:sentences += news_to_sentences(x)#配置词向量的维度。
num_features = 300
#保证被考虑的词汇的频度
min_word_count = 20
#设定并行化训练使用CPU计算核心的数量,多核可用。
num_workers = 2
#定义训练词向量的上下文窗口大小
context = 5
downsampling = 1e-3model = 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)]
通过以上两组输出,我们不难发现,在不使用语言学词典的前提下,词向量技术仍可以借助上下文信息找到词汇之间的相似性。这一技术不仅节省了大量专业人士的作业时间,而且也可以作为一个基础模型应用到更加复杂的自然语言处理任务中。