我正在研究文本分类问题(在法语语料库上),并且正在尝试不同的词嵌入。我对 ConceptNet 提供的东西非常感兴趣,所以我决定试一试。
我无法为我的特定任务找到专门的教程,所以我从他们的博客中获得了建议:
如何使用 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 页面上针对 OOV 单词提出的方法(结果相同):
词外策略
ConceptNet Numberbatch 使用词汇外策略进行评估,该策略有助于其在出现不熟悉单词时的表现。该策略在 ConceptNet 代码库中实现。可以总结如下:
给定一个语言不是英语的未知单词,尝试在英语嵌入中查找等效拼写的单词(因为英语单词往往会出现在所有语言的文本中)。
给定一个未知单词,从末尾删除一个字母,看看它是否是已知单词的前缀。如果是这样,对那些已知单词的嵌入进行平均。
如果前缀仍然未知,则继续从末尾删除字母,直到找到已知前缀。当一个字符剩下时放弃。
我的方法做错了吗?