我正在研究一个文本分类问题(法语语料库),我正在试验不同的单词嵌入。我对ConceptNet提供的东西非常感兴趣,所以我决定试一试。
我无法为我的特殊任务找到一个专门的教程,所以我接受了他们的博客的建议
如何使用ConceptNet Number批处理? 使它尽可能地简单明了: 学习任何使用语义向量的NLP机器学习教程。进入他们告诉你使用word2vec的部分。(一个特别开明的教程可能会告诉您如何使用GloVe 1.2。) 获取ConceptNet数字批处理数据,并使用它。获得更好的结果,也推广到其他语言。
下面您可以找到我的方法(请注意,“numberbatch.txt”是包含推荐的多语言版本的文件: ConceptNet Number批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代码库中实现的。它可概括如下: 如果一个未知单词的语言不是英语,那么试着在英语嵌入中查找拼写相等的单词(因为英语单词往往以所有语言的文本结尾)。 给定一个未知的单词,从末尾删除一个字母,看看它是否是已知单词的前缀。如果是的话,平均这些已知单词的嵌入量。 如果前缀仍然未知,请继续从末尾删除字母,直到找到已知前缀为止。当一个角色还存在的时候放弃吧。
我的方法做错了什么吗?
发布于 2020-11-06 16:02:32
您是否考虑到了ConceptNet Numberbatch的格式?如项目的GitHub所示,如下所示:
/c/en/绝对值-0.0847 -0.1316 -0.0800 -0.0708 -0.2514 -0.1687 -. /c/en/绝对值0.0056 -0.0051 0.0332 -0.1525 -0.0955 -0.0902 0.07
这种格式意味着不会找到fille,但是/c/fr/fille会找到。
https://stackoverflow.com/questions/64717185
复制相似问题