我尝试使用spaCy进行错字校正,为此,我需要知道词汇中是否存在单词。如果不是这样,则想法是将单词分成两部分,直到所有段都存在为止。例如,“ ofthe”不存在,“ ofof”和“ 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”均为True,并且在词汇表中。我在寻找
之类的简单内容"andshy" in nlp.vocab = False, "andshy".is_oov = True
"apple" in nlp.vocab = True, "apple".is_oov = False
下一步,还有一些单词更正方法。我可以使用拼写检查器库,但这与spaCy vocab不一致
此问题似乎是一个常见问题,任何建议(代码)都将受到欢迎。
谢谢
AHe
答案 0 :(得分:1)
简短的回答:spacy的模型不包含任何适用于拼写校正的单词列表。
更长的答案:
Spacy的vocab
不是特定语言的固定单词列表。它只是一个缓存,其中包含有关在训练和处理过程中看到的令牌的词汇信息。检查令牌是否在nlp.vocab
中只是检查令牌是否在此缓存中,因此这不是用于拼写更正的有用检查。
Token.is_oov
具有更具体的含义,从文档中的简短说明来看并不明显:它报告模型是否包含有关此标记的其他词汇信息,例如Token.prob
。对于像en_core_web_sm
这样的不包含任何概率的小型spacy模型,默认情况下,所有令牌的is_oov
将是True
。 md
和lg
模型包含有关1M +令牌的词法信息,单词向量包含600K +令牌,但是这些列表太大且嘈杂,无法用于拼写校正。
答案 1 :(得分:0)
对于拼写检查,您可以尝试spacy_hunspell。 您可以将其添加到管道中。
更多信息和示例代码在这里: https://spacy.io/universe/project/spacy_hunspell