2

我正在研究文本分类问题(在法语语料库上),并且正在尝试不同的词嵌入。我对 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 代码库中实现。可以总结如下:

给定一个语言不是英语的未知单词,尝试在英语嵌入中查找等效拼写的单词(因为英语单词往往会出现在所有语言的文本中)。

给定一个未知单词,从末尾删除一个字母,看看它是否是已知单词的前缀。如果是这样,对那些已知单词的嵌入进行平均。

如果前缀仍然未知,则继续从末尾删除字母,直到找到已知前缀。当一个字符剩下时放弃。

我的方法做错了吗?

4

1 回答 1

3

您是否考虑了 ConceptNet Numberbatch 的格式?如项目的 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会。

于 2020-11-06T16:02:32.133 回答