python - what - Clasificando FreqDist en NLTK con get vs get()
nltk text python (1)
Estoy jugando con NLTK y el módulo freqDist
import nltk
from nltk.corpus import gutenberg
print(gutenberg.fileids())
from nltk import FreqDist
fd = FreqDist()
for word in gutenberg.words(''austen-persuasion.txt''):
fd[word] += 1
newfd = sorted(fd, key=fd.get, reverse=True)[:10]
Así que estoy jugando con NLTK y tengo una pregunta con respecto a la porción de clasificación. Cuando ejecuto el código de esta manera, ordena correctamente el objeto freqDist. Sin embargo, cuando lo ejecuto con get () en lugar de get encuentro el error
Traceback (most recent call last):
File "C:/Python34/NLP/NLP.py", line 21, in <module>
newfd = sorted(fd, key=fd.get(), reverse=True)[:10]
TypeError: get expected at least 1 arguments, got 0
Por qué es correcto y equivocado (). Tenía la impresión de que get () debería ser correcto, pero supongo que no.
Básicamente, el objeto FreqDist
en NLTK
es una subclase de las collections.Counter
nativas de Python. Counter
, así que vamos a ver cómo funciona Counter
:
Un Counter
es un diccionario que almacena los elementos en una lista como su clave y los recuentos de los elementos como los valores:
>>> from collections import Counter
>>> Counter([''a'',''a'',''b'',''c'',''c'',''c'',''d''])
Counter({''c'': 3, ''a'': 2, ''b'': 1, ''d'': 1})
>>> c = Counter([''a'',''a'',''b'',''c'',''c'',''c'',''d''])
Para obtener una lista de elementos ordenados por su frecuencia, puede usar la función .most_common()
y devolverá una tupla del elemento y su conteo ordenado por los conteos.
>>> c.most_common()
[(''c'', 3), (''a'', 2), (''b'', 1), (''d'', 1)]
Y a la inversa:
>>> list(reversed(c.most_common()))
[(''d'', 1), (''b'', 1), (''a'', 2), (''c'', 3)]
Al igual que un diccionario, puede iterar a través de un objeto Contador y devolverá las claves:
>>> [key for key in c]
[''a'', ''c'', ''b'', ''d'']
>>> c.keys()
[''a'', ''c'', ''b'', ''d'']
También puede usar la función .items()
para obtener una tupla de las claves y sus valores:
>>> c.items()
[(''a'', 2), (''c'', 3), (''b'', 1), (''d'', 1)]
Alternativamente, si solo necesita las claves ordenadas por sus recuentos, vea Transpose / Unzip Function (¿Inversa de zip?) :
>>> k, v = zip(*c.most_common())
>>> k
(''c'', ''a'', ''b'', ''d'')
Volviendo a la pregunta de .get
vs .get()
, la primera es la función en sí, mientras que la segunda es una instancia de la función que requiere la clave del diccionario como su parámetro:
>>> c = Counter([''a'',''a'',''b'',''c'',''c'',''c'',''d''])
>>> c
Counter({''c'': 3, ''a'': 2, ''b'': 1, ''d'': 1})
>>> c.get
<built-in method get of Counter object at 0x7f5f95534868>
>>> c.get()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: get expected at least 1 arguments, got 0
>>> c.get(''a'')
2
Al invocar el parámetro sorted()
, key=...
dentro de la función sorted
no es la clave de la lista / diccionario que está ordenando, pero la clave que sorted
debe usarse para ordenar.
Entonces estos son lo mismo, pero solo devuelven los valores de las claves:
>>> [c.get(key) for key in c]
[2, 3, 1, 1]
>>> [c[key] for key in c]
[2, 3, 1, 1]
Y al ordenar, los valores se utilizan como criterios para ordenar, por lo que logran el mismo resultado:
>>> sorted(c, key=c.get)
[''b'', ''d'', ''a'', ''c'']
>>> v, k = zip(*sorted((c.get(key), key) for key in c))
>>> list(k)
[''b'', ''d'', ''a'', ''c'']
>>> sorted(c, key=c.get, reverse=True) # Highest to lowest
[''c'', ''a'', ''b'', ''d'']
>>> v, k = zip(*reversed(sorted((c.get(key), key) for key in c)))
>>> k
(''c'', ''a'', ''d'', ''b'')