Извлечение набора слов с помощью Python / NLTK, затем сравнение его со стандартным английским словарем - PullRequest
5 голосов
/ 07 августа 2010

у меня есть:

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. Я гораздо больше словесный человек, чем человек, ориентированный на математику, поэтому я еще не понял, как это сделать, и в руководстве слишком подробно рассказывается о том, что я на самом деле не хочу делать. Я предполагаю, что это всего лишь одна или две строки кода.

1 Ответ

4 голосов
/ 07 августа 2010

Если ваш английский словарь действительно является набором (мы надеемся, что слова в нижнем регистре),

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) даст вам список немного быстрее, но в совершенно произвольном порядке, и Я подозреваю, что вы бы предпочли немного подождать и получить взамен прекрасный алфавитный результат; -).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...