使用Python/NLTK提取一组单词,然后将其与标准英语词典进行比较

mag*_*tar 5 python text nlp set nltk

我有:

from __future__ import division
import nltk, re, pprint
f = open('/home/a/Desktop/Projects/FinnegansWake/JamesJoyce-FinnegansWake.txt')
raw = f.read()
tokens = nltk.wordpunct_tokenize(raw)
text = nltk.Text(tokens)
words = [w.lower() for w in text]

f2 = open('/home/a/Desktop/Projects/FinnegansWake/catted-several-long-Russian-novels-and-the-NYT.txt')
englishraw = f2.read()
englishtokens = nltk.wordpunct_tokenize(englishraw)
englishtext = nltk.Text(englishtokens)
englishwords = [w.lower() for w in englishwords]
Run Code Online (Sandbox Code Playgroud)

这是直接来自NLTK手册.我接下来想要做的是比较vocab一套详尽的英语单词,比如OED,并提取差异 - 一组没有,也可能永远不会出现在OED中的Finnegans唤醒词.我更像是一个口头的人,而不是一个数学导向的人,所以我还没有想出如何做到这一点,并且手册对于我实际上不想做的事情进行了太多细节.不过,我假设它只是一两行代码.

Ale*_*lli 5

如果你的英语词典确实是一个集合(希望是小写单词),

set(vocab) - english_dictionary
Run Code Online (Sandbox Code Playgroud)

vocab给你一组在该集合中但不在一个单词中的单词english_dictionary。(遗憾的是你vocab这样就变成了一个列表sorted,因为你需要将它转回一个集合来执行诸如此集合差异之类的操作!)。

如果您的英语词典采用某种不同的格式,而不是真正的集合或不只由小写单词组成,您必须告诉我们该格式是什么,以便我们能够提供帮助!-)

编辑:鉴于OP的编辑显示words(以前称为vocab)和englishwords(我以前称为english_dictionary)实际上都是小写单词列表,那么

newwords = set(words) - set(englishwords)
Run Code Online (Sandbox Code Playgroud)

或者

newwords = set(words).difference(englishwords)
Run Code Online (Sandbox Code Playgroud)

有两种表达“非英语单词的单词集”的方法。前者稍微简洁一些,后者可能更具可读性(因为它明确地使用“差异”一词,而不是减号),并且可能更高效一点(因为它没有明确地将列表转换englishwords为集合) ——不过,如果速度至关重要,则需要通过测量来检查,因为“内部”difference仍然需要进行某种“转换为设置”之类的操作)。

如果您渴望得到一个列表而不是一个集合作为结果,sorted(newwords)将为您提供一个按字母顺序排序的列表(list(newwords)会给您一个更快一点的列表,但顺序完全任意,我怀疑您宁愿稍等一下额外的时间,作为回报,得到一个很好的按字母顺序排列的结果;-)。