Extraindo um conjunto de palavras com o python/nltk e depois comparando -o com um dicionário de inglês padrão

StackOverflow https://stackoverflow.com/questions/3428131

  •  26-09-2019
  •  | 
  •  

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.

Foi útil?

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 ;-).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top