Extraire un ensemble de mots avec le Python / NLTK, puis comparer à un dictionnaire anglais standard

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

  •  26-09-2019
  •  | 
  •  

Question

Je:

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]

qui est directement du manuel NLTK. Ce que je veux faire ensuite est de comparer vocab à un ensemble exhaustif de mots anglais, comme l'OED, et extraire la différence - l'ensemble des mots de Finnegans Wake qui ont pas, et ne sera probablement jamais, dans l'OED. Je suis beaucoup plus d'une personne verbale qu'une personne orientée mathématiques, donc je ne l'ai pas compris comment faire encore, et le manuel va dans beaucoup trop de détails sur des choses que je ne veux pas vraiment faire. Je suppose qu'il est juste une ou deux lignes de code, cependant.

Était-ce utile?

La solution

Si votre dictionnaire anglais est en effet un ensemble (je l'espère de mots en minuscules),

set(vocab) - english_dictionary

vous donne l'ensemble des mots qui sont dans l'ensemble de vocab mais pas dans celui de english_dictionary. (Il est dommage que vous avez tourné vocab dans une liste par cette sorted, puisque vous devez le remettre dans un ensemble pour effectuer des opérations telles que cette différence de jeu!).

Si votre dictionnaire anglais est dans un format différent, pas vraiment un ensemble ou non composé uniquement de mots en minuscules, vous devez nous dire ce que le format est pour nous d'être en mesure d'aider -)

Modifier : données modifier les attributs OP montre que les deux words (ce qui était auparavant appelé vocab) et englishwords (ce que j'ai appelé précédemment english_dictionary) sont dans les listes de fait des mots en minuscules, puis

newwords = set(words) - set(englishwords)

ou

newwords = set(words).difference(englishwords)

sont deux façons d'exprimer « l'ensemble des mots qui ne sont pas englishwords ». Le premier est un peu plus concis, ce dernier peut-être un peu plus facile à lire (car il utilise le mot « différence » explicitement, au lieu d'un signe moins) et peut-être un peu plus efficace (car il ne transforme pas explicitement la liste englishwords en ensemble - bien que, si la vitesse est cruciale cela doit être vérifié par la mesure, car « en interne » difference doit encore faire une sorte de « transformation à ensemble » -comme opération)

.

Si vous avez envie d'avoir une liste à la suite au lieu d'un ensemble, sorted(newwords) vous donnera une liste triée par ordre alphabétique (list(newwords) vous donnera une liste un peu plus rapide, mais pour tout à fait arbitraire, et je vous soupçonnez » d plutôt attendre une petite quantité de temps supplémentaire et d'obtenir, en retour, un résultat bien alphabétisée; -).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top