2017-08-19 5 views
0

J'essaie de créer un modèle de 3 grammes pour appliquer des techniques d'apprentissage automatique.Les trigrammes de vectorisation avec tous les 3 grammes possibles - Python

Fondamentalement, je suis en train comme suit:

import nltk 
from sklearn.feature_extraction.text import CountVectorizer 
import itertools 

my_array = ['worda', 'wordb'] 
vector = CountVectorizer(analyzer=nltk.trigrams,ngram_range=(3,3)) 
vector.fit_transform(my_array) 

Mon vocabulaire:

{('o', 'r', 'd'): 0, 
('r', 'd', 'a'): 1, 
('r', 'd', 'b'): 2, 
('w', 'o', 'r'): 3} 

Aucun de mes mots ont des espaces ou des caractères spéciaux. Alors, quand je lance ceci:

tr_test = vector.transform(['word1']) 
print(tr_test) 
print(tr_test.shape) 

Je reçois ce retour:

(0, 0) 1 
(0, 1) 1 
(0, 3) 1 
(1, 4) #this is the shape 

Je pense que cela est juste ... au moins logique ... Mais je voudrais représenter chaque mot avec une matrice contenant toutes les possibilités de 3 grammes. Ainsi, chaque travail serait représenté par une matrice (1x17576). Maintenant, j'utilise la matrice 1x4 (dans ce cas particulier), parce que mon vocabulaire est construit sur la base de mes données.

17576 (263) - Représente toutes les combinaisons 3 lettres dans l'alphabet (aaa, AAB, aac, etc ...)

J'ai essayé de mettre mon vocabulaire à un tableau avec toutes les possibilités de 3 grammes, comme ceci:

#This creates an array with all 3 letters combination 
#['aaa', 'aab', 'aac', ...] 
keywords = [''.join(i) for i in itertools.product(ascii_lowercase, repeat = 3)] 
vector = CountVectorizer(analyzer=nltk.trigrams,ngram_range=(3,3), vocabulary=keywords) 

Cela n'a pas fonctionné ... Quelqu'un peut comprendre comment faire cela?

Merci !!!

Répondre

1

J'ai essayé de changer l'analyseur de 'char', et il semble fonctionner maintenant:

keywords = [''.join(i) for i in itertools.product(ascii_lowercase, repeat = 3)] 
vector = CountVectorizer(analyzer='char', ngram_range=(3,3), vocabulary=keywords) 
tr_test = vector.transform(['word1']) 
print(tr_test) 

Et la sortie est:

(0, 9909) 1 
    (0, 15253) 1 

Tout comme un chèque:

test = vector.transform(['aaa aab']) 
print(test) 

La sortie:

(0, 0) 1 
(0, 1) 1