python - tutorial - ¿Puedo usar CountVectorizer en scikit-learn para contar la frecuencia de los documentos que no se usaron para extraer los tokens?
predicciones python (3)
Debería llamar a fit_transform
o simplemente fit
en su fuente de vocabulario original para que el vectorizador aprenda un vocabulario.
Luego puede usar este vectorizador de fit
en cualquier nueva fuente de datos a través del método transform()
.
Puede obtener el vocabulario producido por el ajuste (es decir, mapeo de ID de palabra a token) a través de vectorizer.vocabulary_
(suponiendo que nombre a su CountVectorizer
el vectorizer
nombre.
He estado trabajando con la clase CountVectorizer en scikit-learn.
Entiendo que si se usa de la manera que se muestra a continuación, el resultado final consistirá en una matriz que contiene recuentos de funciones o tokens.
Estos tokens se extraen de un conjunto de palabras clave, es decir,
tags = [
"python, tools",
"linux, tools, ubuntu",
"distributed systems, linux, networking, tools",
]
El siguiente paso es:
from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(tokenizer=tokenize)
data = vec.fit_transform(tags).toarray()
print data
Donde obtenemos
[[0 0 0 1 1 0]
[0 1 0 0 1 1]
[1 1 1 0 1 0]]
Esto está bien, pero mi situación es un poco diferente.
Quiero extraer las características de la misma manera que la anterior, pero no quiero que las filas en los data
sean los mismos documentos de los que se extrajeron las características.
En otras palabras, ¿cómo puedo obtener recuentos de otro conjunto de documentos, por ejemplo,
list_of_new_documents = [
["python, chicken"],
["linux, cow, ubuntu"],
["machine learning, bird, fish, pig"]
]
Y obten:
[[0 0 0 1 0 0]
[0 1 0 0 0 1]
[0 0 0 0 0 0]]
He leído la documentación de la clase CountVectorizer
y encontré el argumento de vocabulary
, que es un mapeo de términos para caracterizar índices. Sin embargo, no puedo entender este argumento para ayudarme.
Cualquier consejo es apreciado.
PD: todo el crédito debido al blog de Matthias Friedrich para el ejemplo que utilicé arriba.
Tienes razón en que el vocabulary
es lo que quieres. Funciona así:
>>> cv = sklearn.feature_extraction.text.CountVectorizer(vocabulary=[''hot'', ''cold'', ''old''])
>>> cv.fit_transform([''pease porridge hot'', ''pease porridge cold'', ''pease porridge in the pot'', ''nine days old'']).toarray()
array([[1, 0, 0],
[0, 1, 0],
[0, 0, 0],
[0, 0, 1]], dtype=int64)
Entonces, le pasa un dict con las características deseadas como las teclas.
Si usó CountVectorizer
en un conjunto de documentos y luego desea usar el conjunto de características de esos documentos para un nuevo conjunto, use el atributo vocabulary_
de CountVectorizer original y páselo al nuevo. Entonces en tu ejemplo, podrías hacer
newVec = CountVectorizer(vocabulary=vec.vocabulary_)
para crear un nuevo tokenizer usando el vocabulario de su primera.
>>> tags = [
"python, tools",
"linux, tools, ubuntu",
"distributed systems, linux, networking, tools",
]
>>> list_of_new_documents = [
["python, chicken"],
["linux, cow, ubuntu"],
["machine learning, bird, fish, pig"]
]
>>> from sklearn.feature_extraction.text import CountVectorizer
>>> vect = CountVectorizer()
>>> tags = vect.fit_transform(tags)
# vocabulary learned by CountVectorizer (vect)
>>> print(vect.vocabulary_)
{''python'': 3, ''tools'': 5, ''linux'': 1, ''ubuntu'': 6, ''distributed'': 0, ''systems'': 4, ''networking'': 2}
# counts for tags
>>> tags.toarray()
array([[0, 0, 0, 1, 0, 1, 0],
[0, 1, 0, 0, 0, 1, 1],
[1, 1, 1, 0, 1, 1, 0]], dtype=int64)
# to use `transform`, `list_of_new_documents` should be a list of strings
# `itertools.chain` flattens shallow lists more efficiently than list comprehensions
>>> from itertools import chain
>>> new_docs = list(chain.from_iterable(list_of_new_documents)
>>> new_docs = vect.transform(new_docs)
# finally, counts for new_docs!
>>> new_docs.toarray()
array([[0, 0, 0, 1, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 0]])
Para verificar que CountVectorizer
está utilizando el vocabulario aprendido de las tags
en new_docs
: print vect.vocabulary_
nuevamente o compare el resultado de new_docs.toarray()
con el de tags.toarray()