我刚刚开始开发一个非常简单的程序,得到一个txt文件,并根据它告诉你拼写错误的单词。我查了一下什么是最好的程序,我读到NLTK并使用 "Words"。我做了,并注意到它没有正确地做它的工作,或者也许我没有做正确的事情,它实际上是我的错,但有人可以请检查出来。
from nltk.corpus import words
setwords = set(words.words())
def prompt():
userinput = input("File to Evaluate: ").strip()
with open(userinput, 'r') as file:
words = file.read()
return words
def main():
error_list = []
words = prompt()
words_splitted = words.split()
for i in words_splitted:
if i in setwords:
pass
elif i not in setwords:
error_list.append(i)
print(f"We're not sure these words exist: {error_list}")
if __name__ == '__main__':
main()
程序运行得很好,但请给我一些帮助,让我弄清楚NLTK到底是检测单词的能力不好,还是我的程序出现了故障。我在使用这个程序时,使用的是testing.txt,这个文件是著名的John Quincy Adams母亲的信。
终端上的输出是这样的。截图输出
如图所示,它只是打印出了很多根本不应该混淆的字,如'岁月'、'天'、'比赛'等
NLTK是用来帮助做自然语言分析的。我真的不确定它是否是试图进行拼写纠正的最佳工具。首先,你正在使用的单词列表并不试图包含每一个可能的正确拼写的单词,因为它假设你将使用其中一个 "茎杆" 内置于NLTK中;词干试图找出每个词的 "词干"(或词基)。词干可以让软件包分析出 "年龄 "的复数 "age",而这一事实意味着没有必要将 "年龄 "包含在单词列表中。
值得注意的是,NLTK包含了一些实用工具,这些工具能更好地将输入分割成单词,这比单纯调用 string.split()
,它对标点符号一无所知。如果你要使用NLTK,你最好让它来帮你做这些工作,比如使用 nltk.word_tokenize
功能。
此外,NLTK一般会在不知道一个词是什么的情况下尝试猜测它是什么,这意味着它经常能够识别出一个拼写错误甚至是发明的词的语音部分。
举个例子,我对Lewis Carroll的著名的 Jabberwocky,以产生以下输出。(我添加了每个语音部分标签的定义,以便于阅读。)
>>> poem = """'Twas brillig, and the slithy toves
... did gyre and gimble in the wabe:
... All mimsy were the borogoves,
... and the mome raths outgrabe.
... """
>>> print('\n'.join(f"{word+' :':<12}({tag}) {tagdict[tag][0]}"
... for word, tag in nltk.pos_tag(nltk.word_tokenize(poem))))
'T : (NN) noun, common, singular or mass
was : (VBD) verb, past tense
brillig : (NN) noun, common, singular or mass
, : (,) comma
and : (CC) conjunction, coordinating
the : (DT) determiner
slithy : (JJ) adjective or numeral, ordinal
toves : (NNS) noun, common, plural
did : (VBD) verb, past tense
gyre : (NN) noun, common, singular or mass
and : (CC) conjunction, coordinating
gimble : (JJ) adjective or numeral, ordinal
in : (IN) preposition or conjunction, subordinating
the : (DT) determiner
wabe : (NN) noun, common, singular or mass
: : (:) colon or ellipsis
All : (DT) determiner
mimsy : (NNS) noun, common, plural
were : (VBD) verb, past tense
the : (DT) determiner
borogoves : (NNS) noun, common, plural
, : (,) comma
and : (CC) conjunction, coordinating
the : (DT) determiner
mome : (JJ) adjective or numeral, ordinal
raths : (NNS) noun, common, plural
outgrabe : (RB) adverb
. : (.) sentence terminator
NLTK是一个非同寻常的作品,有很多实际应用。我只是不确定你的是其中之一。但如果你还没有这样做,请看一下介绍NLTK的创意共享许可书。用Python进行自然语言处理. 本书不仅是一本很好的NLTK库指南,也是一本温和的Python 3文本处理入门书。