我尝试用spaCy纠正打字错误,为此我需要知道一个单词是否存在于词汇表中。如果没有,想法是将单词一分为二,直到所有片段都存在。例如,"ofthe“不存在,"of”和"the“不存在。所以我首先需要知道一个单词是否存在于单词表中。这就是问题的开始。我试着:
for token in nlp("apple"):
print(token.lemma_, token.lemma, token.is_oov, "apple" in nlp.vocab)
apple 8566208034543834098 True True
for token in nlp("andshy"):
print(token.lemma_, token.lemma, token.is_oov, "andshy" in nlp.vocab)
andshy 4682930577439079723 True True
很明显,这是没有意义的,在这两种情况下,"is_oov“都是真的,而且它在词汇表中。我在找一些简单的东西,比如
"andshy" in nlp.vocab = False, "andshy".is_oov = True
"apple" in nlp.vocab = True, "apple".is_oov = False
并在下一步中,也提出了一些文字校正的方法。我可以使用拼写检查库,但这与spaCy词汇不一致
这个问题似乎是一个常见的问题,欢迎任何建议(代码)。
谢谢,
AHe
发布于 2020-01-06 10:06:10
简而言之:spacy的模型不包含任何适合拼写更正的单词列表。
更长的答案:
Spacy的vocab
不是一种特定语言中的固定单词列表。它只是一个缓存,其中包含在训练和处理过程中看到的有关标记的词汇信息。检查令牌是否在nlp.vocab
中只是检查令牌是否在此缓存中,因此对于拼写更正来说,这不是一个有用的检查。
Token.is_oov
有一个更具体的含义,这在文档中的简短描述中并不明显:它报告模型是否包含有关此标记的一些额外词汇信息,如Token.prob
。对于像en_core_web_sm
这样不包含任何概率的小型空间模型,默认情况下所有令牌的is_oov
都是True
。md
和lg
模型包含有关1M+标记的词汇信息,单词向量包含600K+标记,但这些列表太大且噪声太大,不适用于拼写更正。
发布于 2020-04-20 23:19:12
对于拼写检查,您可以尝试使用spacy_hunspell。您可以将其添加到管道中。
更多信息和示例代码在这里:https://spacy.io/universe/project/spacy_hunspell
https://stackoverflow.com/questions/59523161
复制