2017-08-19 9 views
0

私は機械学習技術を適用するために3-gramモデルを作成しようとしています。可能なすべての3-gramでベクトル化するトライグラム - Python

は基本的に私は次のようにしようとしている:

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) 

私の語彙:

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

私の言葉はどれも、スペースや特殊文字を持っていません。 だから私はこの実行すると:

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

を、私はこのリターンを得る:

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

私はこれが正しいと思う...少なくとも理にかなって... しかし、私は各単語を表現したいと思いますすべての3グラムの可能性を含む行列を使用します。したがって、各作業は(1x17576)の行列で表されます。 私のボキャブラリは自分のデータに基づいて構築されているので、今は1x4の行列を使っています(この例の場合)。

17576(263) - (... AAA、AAB、AACなど)のアルファベットで、すべての3つの文字の組み合わせを表します

私は次のように、すべての3グラムの可能性を持つ配列への私の語彙を設定しようとしましたこの:

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

これは機能しませんでした...誰かがこれを行う方法を理解することができますか?

ありがとうございました!

答えて

1

私は '文字' にアナライザを変更しようとしました、そしてそれが今で動作しているようです:

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) 

、出力は次のとおりです。ただ、チェックとして

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

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

出力:

(0, 0) 1 
(0, 1) 1 
関連する問題