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

5 投票
1 回答
3310 浏览
提问于 2025-04-16 02:26

我有:

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),然后找出它们之间的差异——也就是《芬尼根的守灵夜》中那些不在OED里的单词,可能永远也不会出现在OED里的单词。我更擅长语言方面的东西,而不是数学,所以我还没想出怎么做到这一点,而且手册里讲的内容太复杂了,很多我其实并不想做的事情。不过我觉得这可能只需要一两行代码就能解决。

1 个回答

5

如果你的英文词典确实是一个集合(希望里面都是小写字母的单词),

set(vocab) - english_dictionary

这段代码会给你一个单词集合,这些单词在 vocab 集合里,但不在 english_dictionary 里。(可惜的是,你把 vocabsorted 转换成了一个列表,现在你需要把它再变回集合,才能进行像这样的集合差集操作!)

如果你的英文词典格式不一样,不是真正的集合,或者里面不全是小写字母的单词,你得告诉我们那是什么格式,这样我们才能帮你!-)

编辑: 根据提问者的编辑,显示 words(之前叫 vocab)和 englishwords(之前叫 english_dictionary)实际上都是小写字母单词的列表,那么

newwords = set(words) - set(englishwords)

或者

newwords = set(words).difference(englishwords)

这两种方式都可以表示“不是英文单词的单词集合”。前一种方式稍微简洁一些,后一种可能更容易阅读(因为它明确使用了“差集”这个词,而不是减号),而且可能更高效(因为它没有明确把列表 englishwords 转换成集合——不过,如果速度很重要,这需要通过测量来确认,因为在“内部”,difference 仍然需要进行某种“转换为集合”的操作)。

如果你希望结果是一个列表而不是集合,sorted(newwords) 会给你一个按字母顺序排列的列表(list(newwords) 会更快地给你一个列表,但顺序是完全随机的,我想你可能更愿意多等一点时间,换来一个整齐的字母顺序结果;-)。

撰写回答