5

我有:

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]

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

4

1 回答 1

4

如果您的英语词典确实是一组(希望是小写单词),

set(vocab) - english_dictionary

为您提供一组单词,这些单词在vocab集合中但不在english_dictionary一个集合中。(很遗憾你被那个变成vocab了一个列表sorted,因为你需要把它变成一个集合来执行这个集合差之类的操作!)。

如果您的英语词典采用不同的格式,而不是真正的集合或不仅仅包含小写单词,您必须告诉我们该格式是什么,我们才能提供帮助!-)

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

newwords = set(words) - set(englishwords)

或者

newwords = set(words).difference(englishwords)

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

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

于 2010-08-06T22:41:41.987 回答