问题描述
我正在研究文本分类问题(在法国语料库上),并且正在尝试不同的单词嵌入。我对ConceptNet所提供的功能非常感兴趣,因此决定试一试。
我无法为我的特定任务找到专门的教程,因此我从他们的blog那里得到了建议:
如何使用ConceptNet Numberbatch?
使其尽可能简单明了:
遍历有关使用NLP的机器学习的任何教程 语义向量。转到他们告诉您使用word2vec的部分。 (特别启发的教程可能会告诉您使用glove 1.2。)
获取ConceptNet Numberbatch数据,并改用它。好转 结果也可以推广到其他语言。
下面您可能会发现我的方法(请注意,“ numberbatch.txt”是包含建议的多语言版本的文件:ConceptNet Numberbatch 19.08):
embeddings_index = dict()
f = open('numberbatch.txt')
for line in f:
values = line.split()
word = values[0]
coefs = asarray(values[1:],dtype='float32')
embeddings_index[word] = coefs
f.close()
print('Loaded %s word vectors.' % len(embeddings_index))
我首先测试一个单词是否存在:
word = 'fille'
missingWords = 0
if word not in embeddings_index:
missingWords += 1
print(missingWords)
令我惊讶的是,没有找到像“ fille ”(法语中的女孩)这样的简单单词。然后,我创建了一个用于打印语料库中所有OOV单词的函数。分析结果时,我更加惊讶:未找到超过22k的单词(包括诸如' nous '(we),'être'(to be)等。
我还尝试了GitHub page上提出的针对OOV单词的方法(结果相同):
词汇量不足策略
ConceptNet Numberbatch采用了不言而喻的策略进行评估 在不熟悉单词的情况下有助于其性能。的 策略在ConceptNet代码库中实现。有可能 总结如下:
给出一个非英语的未知单词,尝试查找 英文嵌入中的拼写相等的单词(因为 英文单词往往以所有语言的文本结尾。
给出一个 未知单词,从末尾删除一个字母,然后看是否是一个 已知单词的前缀。如果是这样,请平均已知的嵌入 话。
如果前缀仍然未知,请继续从中删除字母 直到找到已知的前缀为止。单身时放弃 性格依然存在。
我的方法做错了吗?
解决方法
您是否考虑到ConceptNet Numberbatch的格式?如project's GitHub所示,如下所示:
/ c / en / absolute_value -0.0847 -0.1316 -0.0800 -0.0708 -0.2514 -0.1687 -...
/ c / en / absolute_zero 0.0056 -0.0051 0.0332 -0.1525 -0.0955 -0.0902 0.07 ...
此格式表示找不到fille
,但找到/c/fr/fille
。