Antes de empezar, debes recordar que los n-gramas son conjuntos de elementos consecutivos que están presentes en un corpus. Estos pueden incluir palabras, números, cualquier otro carácter especial y signos de puntuación. Ahora, en este artículo, veremos cómo generar n-grams como features en el count vectorizer.
N-grams como features
El parámetro ngram : range (tupla)
permite definir los valores de n para los ngrams (mínimo y máximo) que serán calculados. Por defecto: ngram_range = (1, 1)
(solo palabras).
De cara a la definición de features, podemos definir los n-grams como features en count vectorizer, es decir, en vez de tener como parámetros de vocabulario simplemente tokens, podemos hacer que sean n-grams como features.
Dentro del propio count vectorizer tenemos parámetros en los que podemos definir el rango del n-grama.
A continuación lo que hacemos es decirle al algoritmo que nos genere n-gramas de un único token hasta una combinación de tres tokens y que, a partir de eso, nos genere un vocabulario y la codificación del corpus.
#N-grams como features
vectorizer = CountVectorizer (ngram_range = (1, 3)) #Jugar con los valores
X = vectorizer. fit_transform (corpus)
Si imprimimos los feature names, nos salen muchísimos:
[‘de’, ‘de perros’, ‘gustan’, ‘gustan los’, ‘gustan los perros’, ‘hay’, ‘hay muchas’, ‘hay muchas razas’, ‘hay perros’, ‘hay perros perros’, ‘los’, ‘los perros’, ‘me’, ‘me gustan’, ‘me gustan los’, ‘muchas’, ‘muchas razas’, ‘muchas razas de’, ‘perros’, ‘perros perros’, ‘razas’, ‘razas de’, ‘razas de perros’].
#N-grams como features
print (vectorizer. get_feature_names ())
Luego, cuando aplicamos esto para ver la representación, vemos que aquí tenemos vectores, que son más largos que nuestro vocabulario aumentado, ya que estamos utilizando n-grams como features. Puede que de esta forma podamos recoger información del contexto en nuestra representación vectorial, dado que al utilizar n-grams como features capturamos más información del contexto:
#N-grams como features
doc_term_matrix = pd.DataFrame (X.toarray (), columns = vectorizer. get_feature_names ())
doc_term_matrix
de | de perros | gustan | gustan los | gustan los perros | hay | hay muchas | hay muchas razas | hay perros | hay perros perros | los | los perros | me | me gustan | me gustan los | muchas | muchas razas | muchas razas de | perros | perros perros | razas | razas de | razas de perros | |
0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 1 | 0 | 0 | 0 |
2 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
Si utilizamos únicamente tokens, no podemos recolectar esta información; sin embargo, al utilizar como vocabulario n-grams como features, existe esa posibilidad.
En este caso podemos jugar con el rango, por ejemplo, decir que no queremos que nos recoja tokens, que únicamente queremos información del contexto. Para esta situación podríamos definir que el rango fuera de 2 a 4, es decir, que nos genere n-grams con una combinación de dos tokens hasta cuatro tokens y que, a partir de ahí, nos genere el vocabulario y obtenemos todas las features posibles. Veamos:
#N-grams como features
vectorizer = CountVectorizer (ngram_range = (2 , 4)) #Jugar con los valores
X = vectorizer. fit_transform (corpus)
#N-grams como features
print (vectorizer. get_feature_names ())
Aquí el resultado:
[‘de perros’, ‘gustan los’, ‘gustan los perros’, ‘hay muchas’, ‘hay muchas razas’, ‘hay muchas razas de’, ‘hay perros’, ‘hay perros perros’, ‘los perros’, ‘me gustan’, ‘me gustan los’, ‘me gustan los perros’, ‘muchas razas’, ‘muchas razas de’, ‘muchas razas de perros’, ‘perros perros’, ‘razas de’, ‘razas de perros’]
de perros | gustan los | gustan los perros | hay muchas | hay muchas razas | hay muchas razas de | hay perros | hay perros perros | los perros | me gustan | me gustan los | me gustan los perros | muchas razas | muchas razas de | muchas razas de perros | perros perros | razas de | razas de perros | |
0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
2 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 |
Para poder acceder a las opciones laborales del Big Data, uno de los mercados con mayor demanda y mejores salarios, tenemos para ti el Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp. Con esta formación adquirirás los conocimientos para abrirte paso en el mundillo tecnológico. ¡No dudes en impulsar tu futuro y entra ya para pedir más información!