usar tutorial scikit predicciones metodos libreria learn instalar como clasificadores clasificacion algoritmo python machine-learning scikit-learn tf-idf

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()