作者 | Kourosh Alizadeh
编译 | VK
来源 | Towards Data Science
![](https://i-blog.csdnimg.cn/blog_migrate/84838172b03b0071d390231b7434f911.jpeg)
在过去,我在为我的一个项目训练词向量,但我一直在碰壁。我在研究哲学史上的文本,试图找到可以揭示作者如何使用一个词的向量。但我一直得到这样的结果:
![](https://i-blog.csdnimg.cn/blog_migrate/337faeeca06005e898bc5f418307f7fc.png)
如果你斜视得很厉害,也许这是有道理的。毕竟,爱确实与完美有关,对吧?
但是相似性分数很小,我们不想为了让结果有意义而眯着眼睛看。
为了解决这个问题,我试着调整超参数,但结果甚至比这更差。
但后来我灵机一动。我将使用GloVe预训练好的词向量作为基线,而不是单独在我的数据集上训练数据。这意味着基本上我的机器已经知道基本的英语了,然后只需要微调以更准确地匹配我的数据。
这个过程比我预期的要困难一些,而且我找不到任何完整的教程,所以我想我应该写一个。这个过程基本上有三个步骤,我将按顺序介绍它们。如果你只想得到一个结果,可以跳到最后查看笔记本。
本教程需要Gensim Word2Vec库。
步骤1:加载向量
要训练GloVe嵌入,你需要将嵌入加载到你的系统中。你可以在这里下载:https://nlp.stanford.edu/projects/glove/
一旦你有了一个文件,你可以用下面的代码来加载它。
glove_file = datapath('YOUR_DATAPATH_HERE')
tmp_file = get_tmpfile("test_word2vec.txt")
_ = glove2word2vec(glove_file, tmp_file)
glove_vectors = KeyedVectors.load_word2vec_format(tmp_file)
这实际上是从GloVe网站获取的.txt文件,并以Gensim Word2Vec库的适当格式加载它。此时,你可以执行通常的相似性搜索来测试是否所有内容都正确加载。
![](https://i-blog.csdnimg.cn/blog_migrate/b1488d28506600ccedb78b5da4021da2.png)
正如你所看到的,GloVe嵌入比我们之前得到的更有意义。
步骤2:建立一个玩具模型来更新
在这一步中,你基本上不需要使用GloVe就可以从数据构建Word2Vec模型。此模型使你能够捕获新词,并构建包含特定数据集的词汇表,如果你处理的文本不仅仅是普通英语,这将非常有用。
# 为了让它工作,输入将是一个标识的列表
# 因为我的数据是在一个数据帧中,我选择了适当的series
documents = df[df['school'] == 'rationalism']['sent_tokenized']
# 然后列进列表
sentences = [sentence for sentence in documents]
# 清理句子
stopwords = [YOUR_STOPWORDS_HERE]
cleaned_sentences = []
for sentence in sentences:
cleaned = [word.lower() for word in sentence]
cleaned = [word for word in cleaned if word not in stopwords]
cleaned_sentences.append(cleaned)
# 在你的数据集中建立一个word2vec模型
base_model = Word2Vec(size=300, min_count=5)
base_model.build_vocab(cleaned_sentences)
total_examples = base_model.corpus_count
很好,现在你有了一个蹩脚的模型可以作为基础。
步骤3:再训练
在这里,你将获取现有模型,添加GloVe词汇表和起始权重,并在数据集上重新训练它。
# 添加GloVe的词汇和权重
base_model.build_vocab([list(glove_vectors.vocab.keys())], update=True)
# 训练你的数据
base_model.train(cleaned_sentences, total_examples=total_examples, epochs=base_model.epochs)
base_model_wv = base_model.wv
结果将是一组新的单词向量,它们使用GloVe的原始权重,但现在也在你自己的数据上调整了。下面是一个结果示例:
![](https://i-blog.csdnimg.cn/blog_migrate/7dcd433c46d4a6d653232c4fc7eaca48.png)
你可能不太了解理性主义哲学,但相信我,这是非常有道理的。他们的主要焦点之一是上帝,我们可以看到,在讨论上帝的爱时,几乎所有这些都是有意义的——上帝爱我们是因为他是好人,他的恩典是爱的表现,他给我们自由是因为他爱我们,等等。
另一个更好的测试方法是,在你的特定数据集中运行。most_similar来检验你的新向量和原来的GloVe向量。下面是我得到的结果的一个例子:
![](https://i-blog.csdnimg.cn/blog_migrate/4ab49ba2df1425af1ce3d823592c79ed.png)
你可以看到,在哲学语料库中,“哲学”与科学和形而上学相联系,而在基本语料库中,没有这种联系。
这很有道理。形而上学在英语口语中(与占星术和超自然有关)和哲学(是一个主要的分支领域)有着截然不同的含义。
所以当哲学家谈论哲学时,形而上学总是在讨论中,但是当普通人谈论哲学时,他们几乎不会把它与形而上学联系起来。哲学家也认为自己是科学的,或者在与自然科学的对话中,一般公众通常看不到哲学和科学之间的紧密联系。
额外步骤:将所有内容整合在一起
好,太好了!现在,你有了一个漂亮的词嵌入,可以用它来生成对语料库的见解,也可以用在深度学习或其他应用程序中。
剩下的就是在一个单一的函数中把所有的函数集合起来:
def train_glove(source, glove_vectors, threshold=10, stopwords=[],
min_count=20):
# 隔离数据帧的相关部分
documents = df[df['source'] == source]['sent_tokenized']
# 格式化要使用的系列
sentences = [sentence for sentence in documents]
# 如果需要,删除停止词
stopwords = []
cleaned = []
for sentence in sentences:
cleaned_sentence = [word.lower() for word in sentence]
cleaned_sentence = [word for word in sentence if word not in stopwords]
cleaned.append(cleaned_sentence)
# 这些后续步骤不在我们最初的描述中,因为它们对任务来说不是必要的
# 如果这些短语足够常见的话,它们可以让你得bigrams,甚至是trigrams
# 获取bigrams
bigram = Phrases(cleaned, min_count=min_count, threshold=threshold,
delimiter=b' ')
bigram_phraser = Phraser(bigram)
bigramed_tokens = []
for sent in cleaned:
tokens = bigram_phraser[sent]
bigramed_tokens.append(tokens)
# 获取trigrams
trigram = Phrases(bigramed_tokens, min_count=min_count, threshold=threshold,
delimiter=b' ')
trigram_phraser = Phraser(trigram)
trigramed_tokens = []
for sent in bigramed_tokens:
tokens = trigram_phraser[sent]
trigramed_tokens.append(tokens)
# 创建一个玩具模型来更新
model = Word2Vec(size=300, min_count=5)
model.build_vocab(trigramed_tokens)
total_examples = model.corpus_count
# 添加GloVe的词汇和权重
model.build_vocab([list(glove_vectors.vocab.keys())], update=True)
# 训练我们的数据
model.train(trigramed_tokens, total_examples=total_examples, epochs=model.epochs)
model_wv = model.wv
# 删除模型以节省内存,并返回词向量进行分析
del model
return model_wv
如果你想看到实际的结果,你可以查看Philosophy数据项目的单词使用分析页面:http://philosophydata.com/w2v.html。
代码地址:https://github.com/kcalizadeh/phil_nlp
感谢阅读!
往期精彩回顾
适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑黄海广老师《机器学习课程》课件合集
本站qq群851320808,加入微信群请扫码: