本港台开奖现场直播 j2开奖直播报码现场
当前位置: 新闻频道 > IT新闻 >

wzatv:【j2开奖】用深度学习获取文本语义:词向量应用于自然语言处理(2)

时间:2016-12-07 21:28来源:香港现场开奖 作者:本港台直播 点击:
与使用目标词的上下文的方法不同,连续跳跃元语法模型是使用目标词去预测它的前后词(参见图3)。据Mikolov等的论文,在训练数据量比较小的时候,跳

  与使用目标词的上下文的方法不同,连续跳跃元语法模型是使用目标词去预测它的前后词(参见图3)。据Mikolov等的论文,在训练数据量比较小的时候,跳跃元语法模型比较好,且对于罕见的词和短语的处理较好。

  

wzatv:【j2开奖】用深度学习获取文本语义:词向量应用于自然语言处理

  图3 用给定的词来预测上下文。来源:Lior Shkiller

  代

  (你可以在这个GitHub库里找到下面例子的代码)

  这个模型(word2vec)的一大好处就是,它可以用于很多种语言。

  我们所要做的就是下载一个所要处理的语言的大数据集。

  从维基百科上找一个大数据集

  我们可以从维基百科里面找到很多语言的数据。用下面的步骤就可以获得一个大数据集。

找到你想处理的语言的ISO 639代码:ISO 639代码的列表

登录https://dumps.wikimedia.org/wiki/latest/ (译者注:此链接已失效)

下载wiki-latest-pages-articles.xml.bz2

  接着,为了让后续的事情变简单,我们会安装gensim。它是一个实现了word2vec的Python库。

  pip install –upgrade gensim

  我们需要用维基百科的下载文件来创建语料库,以用于后续的word2vec模型的训练。下面这段代码的输出就是一个“wiki..text”的文件。其中包括了维基百科的所有文章的所有词汇,atv,并按照语言分开。

  from gensim.corpora import WikiCorpus

  language_code = “he”

  inp = language_code+”wiki-latest-pages-articles.xml.bz2″

  outp = “wiki.{}.text”.format(language_code)

  i = 0

  print(“Starting to create wiki corpus”)

  output = open(outp, ‘w’)

  space = ” ”

  wiki = WikiCorpus(inp, lemmatize=False, dictionary={})

  for text in wiki.get_texts():

  article = space.join([t.decode(“utf-8”) for t in text])

  output.write(article + “n”)

  i = i + 1

  if (i % 1000 == 0):

  print(“Saved ” + str(i) + ” articles”)

  output.close()

  print(“Finished – Saved ” + str(i) + ” articles”)

  训练模型

  参数的说明如下:

size:向量的维度

大的size值会要求更多的训练数据,但能带来更准确的模型

window:在一个句子内,目标词与预测词之间的最大距离

min_count:忽略所有总词频低于这个值的词。

  import multiprocessing

  from gensim.models import Word2Vec

  from gensim.models.word2vec import LineSentence

  language_code = “he”

  inp = “wiki.{}.text”.format(language_code)

  out_model = “wiki.{}.word2vec.model”.format(language_code)

  size = 100

  window = 5

  min_count = 5

  start = time.time()

  model = Word2Vec(LineSentence(inp), sg = 0, # 0=CBOW , 1= SkipGram

  size=size, window=window, min_count=min_count, workers=multiprocessing.cpu_count())

  # trim unneeded model memory = use (much) less RAM

  model.init_sims(replace=True)

  print(time.time()-start)

  model.save(out_model)

  整个word2vec训练过程用了18分钟。

  fastText库

  Facebook的人工智能研究(FAIR)实验室最近发布了fastText库。它是基于Bojanowski等的论文《Enriching Word Vectors with Subword Information》所开发的模型。与word2vec不同,fastText把词表示成一个n元的字母袋。每个向量代表字符袋里的一个n元字母,而一个词则是这些向量的和。

  使用的新库很简单。安装命令:

  pip install fasttext

  训练模型的命令:

  start = time.time()

  language_code = “he”

  inp = “wiki.{}.text”.format(language_code)

  output = “wiki.{}.fasttext.model”.format(language_code)

  model = fasttext.cbow(inp,output)

  print(time.time()-start)

  整个fastText模型训练用了13分钟。

  评估向量:类比性

  下面让我们用之前的那个例子来评估这两个模型的准确度。

  W(“woman”) ? W(“man”)+ W(“queen”)? W(“king”)

  下面的代码首先计算正负词的加权平均值。

  随后,代码计算了所有的测试词汇的向量与加权平均的点乘积。

  我们的评估例子里,测试词汇是整个词汇表。代码的最后是打印出和正词与负词的加权平均值的余弦相似度最高的词。

  import numpy as np

  from gensim.matutils import unitvec

  def test(model,positive,negative,test_words):

  mean = []

  for pos_word in positive:

  mean.append(1.0 * np.array(model[pos_word]))

  for neg_word in negative:

  mean.append(-1.0 * np.array(model[neg_word]))

  # compute the weighted average of all words

  mean = unitvec(np.array(mean).mean(axis=0))

  scores = {}

  for word in test_words:

  if word not in positive + negative:

  test_word = unitvec(np.array(model[word]))

  # Cosine Similarity

  scores[word] = np.dot(test_word, mean)

  print(sorted(scores, key=scores.get, reverse=True)[:1])

  接着,用我们最初的那个例子来做测试。

  用fastText和gensim的word2vec模型来预测:

  positive_words = [“queen”,”man”]

  negative_words = [“king”]

  # Test Word2vec

  print(“Testing Word2vec”)

  model = word2vec.getModel()

  test(model,positive_words,negative_words,model.vocab)

  # Test Fasttext

  print(“Testing Fasttext”)

  model = fasttxt.getModel()

  test(model,positive_words,negative_words,model.words)

  结果

  Testing Word2vec

  [‘woman’]

  Testing Fasttext

  [‘woman’]

  结果显示fastText和gensim的word2vec都能正确预测。

  W(“woman”) ? W(“man”)+ W(“queen”)? W(“king”)

  可见,词向量确实能找到词汇之间的语义关系。

(责任编辑:本港台直播)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容