Extraire un ensemble de mots avec le Python / NLTK, puis comparer à un dictionnaire anglais standard
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.
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; -).