与使用目标词的上下文的方法不同,连续跳跃元语法模型是使用目标词去预测它的前后词(参见图3)。据Mikolov等的论文,在训练数据量比较小的时候,跳跃元语法模型比较好,且对于罕见的词和短语的处理较好。
图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”) 可见,词向量确实能找到词汇之间的语义关系。 (责任编辑:本港台直播) |