用Python/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]
这段代码是直接来自NLTK的手册。接下来我想做的是,把vocab
和一个完整的英语单词集合进行比较,比如《牛津英语词典》(OED),然后找出它们之间的差异——也就是《芬尼根的守灵夜》中那些不在OED里的单词,可能永远也不会出现在OED里的单词。我更擅长语言方面的东西,而不是数学,所以我还没想出怎么做到这一点,而且手册里讲的内容太复杂了,很多我其实并不想做的事情。不过我觉得这可能只需要一两行代码就能解决。
1 个回答
如果你的英文词典确实是一个集合(希望里面都是小写字母的单词),
set(vocab) - english_dictionary
这段代码会给你一个单词集合,这些单词在 vocab
集合里,但不在 english_dictionary
里。(可惜的是,你把 vocab
用 sorted
转换成了一个列表,现在你需要把它再变回集合,才能进行像这样的集合差集操作!)
如果你的英文词典格式不一样,不是真正的集合,或者里面不全是小写字母的单词,你得告诉我们那是什么格式,这样我们才能帮你!-)
编辑: 根据提问者的编辑,显示 words
(之前叫 vocab
)和 englishwords
(之前叫 english_dictionary
)实际上都是小写字母单词的列表,那么
newwords = set(words) - set(englishwords)
或者
newwords = set(words).difference(englishwords)
这两种方式都可以表示“不是英文单词的单词集合”。前一种方式稍微简洁一些,后一种可能更容易阅读(因为它明确使用了“差集”这个词,而不是减号),而且可能更高效(因为它没有明确把列表 englishwords
转换成集合——不过,如果速度很重要,这需要通过测量来确认,因为在“内部”,difference
仍然需要进行某种“转换为集合”的操作)。
如果你希望结果是一个列表而不是集合,sorted(newwords)
会给你一个按字母顺序排列的列表(list(newwords)
会更快地给你一个列表,但顺序是完全随机的,我想你可能更愿意多等一点时间,换来一个整齐的字母顺序结果;-)。