2016-08-26 10 views
0

私は、テキストの異なる行を持つデータフレームを持っている、と私はデータ内の基礎となるテーマを見つけるためにこれらの行をクラスタ化すると仮定します。テキスト解析における列車と試験行列の次元は同じですか?

import pandas as pd 
df = pd.DataFrame({"id_num": np.random.randint(low = 0, high = 50, size = 10), "text": ["hello these are words i would like to cluster", "hello i would like to go home", "home i would like to go please thank you", "thank you please apple banana", "orange banana apple fruit corn", "orange orange orange banana banana banana banana", "can you take me home i have had enough of this place", "i am bored can we go home", "i would like to leave now to go home", "apple apple banana"]) 

私が最初にtraintestには、このデータフレームを分離します:

その後
>>> from sklearn.cross_validation import train_test_split 
>>> train, test = train_test_split(df, test_size = 0.40) 
>>> train, test = train["text"], test["text"] 

クラスタリング処理を開始します。もちろん

>>> from sklearn.feature_extraction.text import TfidfVectorizer 
>>> from sklearn.cluster import KMeans 

>>> vectorizer = TfidfVectorizer() 

>>> train_X = vectorizer.fit_transform(train) 
>>> test_X = vectorizer.fit_transform(test) 

>>> model = KMeans(n_clusters = 2) 

>>> model.fit(train_X) 

>>> model.predict(test_X) 

ValueError: Incorrect number of features. Got 22 features, expected 18. 

、あなたruの場合このコードを自分のマシンに置くと、異なる結果が生じる可能性があります。また、フィーチャの数は、一列に並んでいてもよい。しかし、ほとんどの場合、train_Xtest_Xの寸法は一致しません。

他の誰かがこの問題に対処しましたか?次元を等しくする1つのアプローチは、traintestの両方に存在するフィーチャ(読み込み:ワード)のみを取ることによって、ある種の次元削減を採用することです。より大きな行列を作るもう一つの解法は、与えられた文書が他のコーパスからの単語を持たない両方の行列でゼロを埋めることです。

私はこれに近づくべき別の方法がありますか?

答えて

0

いくつかの掘り下げの後、私は同じ質問にいくつかのStackOverflow答えを見つけました:Python vectorization for classificationScikit learn - fit_transform on the test set

は要するに、私の代わりにfit_transformtransformは、前の行にfit_transformから作成された語彙を維持する使用

train_X = vectorizer.fit_transform(train) 
test_X = vectorizer.transform(test) 

train_X = vectorizer.fit_transform(train) 
test_X = vectorizer.fit_transform(test) 

を変更する必要があり、これらの行列の同じ列を保証します。

+0

それは重複しているので、答えを出す代わりに、質問を重複としてマークするだけです。 – lejlot

関連する問題