2010-08-06 3 views
5

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

+0

Кстати, как я могу форматировать python в вопросе с подсветкой, как это было бы в текстовом редакторе? – magnetar

+0

Отступ все. Выполняется автоматически, если вы выделите его и нажмите кнопку с символами и нулями над редактором. – katrielalex

+0

О, и ваш код не самый эффективный ... вы могли бы разумно использовать итераторы для сохранения нескольких проходов. – katrielalex

ответ

4

Если ваш английский словарь действительно набор (надеюсь из слов нижнего регистра),

set(vocab) - english_dictionary 

дает набор слов, которые в vocab наборе, но не в english_dictionary один. (Очень жаль, что вы превратили vocab в список sorted, так как вам нужно вернуть его обратно в набор для выполнения таких операций, как эта разница!).

Если ваш английский словарь в каком-то другом формате, на самом деле не установлены или не состоящий только из слов нижнего регистра, вы должны сказать нам, что этот формат для нас, чтобы быть в состоянии помочь! -)

Edit: с учетом прав на OP показывает, что оба words (что раньше называлось vocab) и englishwords (то, что я ранее назвал english_dictionary) в действительности являются списками слов нижнего регистра, а затем

newwords = set(words) - set(englishwords) 

или

newwords = set(words).difference(englishwords) 

- два способа выразить «набор слов, которые не являются английскими словами». Первый немного более краткий, последний, возможно, немного читабельнее (поскольку он явно использует слово «различие», вместо знака минус) и, возможно, более эффективен (поскольку он явно не преобразует список englishwords в set - хотя, если скорость имеет решающее значение, это должно быть проверено путем измерения, поскольку «внутренне» difference все еще необходимо выполнить какую-то операцию «преобразование в набор».

Если вы заинтересованы, чтобы получить список в качестве результата вместо набора, sorted(newwords) даст вам в алфавитном порядке отсортированный список (list(newwords) даст вам список немного быстрее, но в совершенно произвольном порядке, и я подозреваю, что вам Достаточно дождаться крошечного дополнительного времени и получить, в свою очередь, красиво алфавитный результат ;-).

+0

Немного изменил вопрос, чтобы отразить эту новую информацию. – magnetar

+0

Это именно то, что мне нужно. Спасибо, Алекс! – magnetar

+0

@tsimotki, добро пожаловать.Обратите внимание, что с вашей нынешней репутацией вы можете «поднять» ответы, которые вам нравятся (будь то ваши собственные вопросы или другие) - действительно, действительно странно (для кого-то, у кого достаточно репутации) принять ответ, не повышая его (принятие означает, что это было самый полезный для решения вашей проблемы, а не аванповования означает, что вам это действительно не понравилось ... необычная комбинация ;-). –