机器学习20-词向量(Word2Vec)技术

使用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)]

通过以上两组输出,我们不难发现,在不使用语言学词典的前提下,词向量技术仍可以借助上下文信息找到词汇之间的相似性。这一技术不仅节省了大量专业人士的作业时间,而且也可以作为一个基础模型应用到更加复杂的自然语言处理任务中。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值