Extraindo um conjunto de palavras com o python/nltk e depois comparando -o com um dicionário de inglês padrão
Pergunta
Eu tenho:
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]
que é direto do manual do NLTK. O que eu quero fazer a seguir é comparar vocab
Para um conjunto exaustivo de palavras em inglês, como o OED, e extraia a diferença - o conjunto de palavras de Finnegans acordam que não o fizeram, e provavelmente nunca estarão, estarão no OED. Sou muito mais uma pessoa verbal do que uma pessoa orientada para a matemática, então ainda não descobri como fazer isso, e o manual entra em detalhes demais sobre coisas que eu realmente não quero fazer. Suponho que seja apenas uma ou duas linhas de código.
Solução
Se o seu dicionário de inglês é realmente um conjunto (espero de palavras mais baixas),
set(vocab) - english_dictionary
dá a você o conjunto de palavras que estão no vocab
definido, mas não no english_dictionary
1. (É uma pena que você virou vocab
em uma lista por isso sorted
, pois você precisa transformá -lo novamente em um conjunto para executar operações como essa diferença!).
Se o seu dicionário de inglês estiver em algum formato diferente, não é realmente um conjunto ou não composto apenas de palavras de base mais baixa, você terá que nos dizer o que esse formato é para podermos ajudar!-)
Editar: dada a edição do OP, mostra que ambos words
(o que foi chamado anteriormente vocab
) e englishwords
(O que eu chamei anteriormente english_dictionary
) são de fato listas de palavras mais baixas, então
newwords = set(words) - set(englishwords)
ou
newwords = set(words).difference(englishwords)
são duas maneiras de expressar "o conjunto de palavras que não são palavras de inglês". O primeiro é um pouco mais conciso, o último talvez um pouco mais legível (já que usa a palavra "diferença" explicitamente, em vez de um sinal de menos) e talvez um pouco mais eficiente (já que não transforma explicitamente a lista englishwords
em um conjunto - porém, se a velocidade é crucial, isso precisa ser verificado por medição, já que "internamente" difference
ainda precisa fazer algum tipo de operação de "transformação para set").
Se você deseja ter uma lista como resultado em vez de um conjunto, sorted(newwords)
dará a você uma lista de classificação alfabética (list(newwords)
daria a você uma lista um pouco mais rápida, mas em ordem totalmente arbitrária, e suspeito que você prefira esperar uma pequena quantidade extra de tempo e obter, em troca, um resultado bem alfabetizado ;-).