4

いくつかのクラスタリング タスクのために scikit-learn でカスタム語彙を使用しようとしていますが、非常に奇妙な結果が得られます。

カスタム語彙を使用しない場合、プログラムは正常に実行され、クラスターの作成に満足しています。ただし、カスタム語彙として使用したい単語のグループ (約 24,000) を既に特定しています。

単語は SQL Server テーブルに格納されます。これまでに2つのアプローチを試しましたが、最後に同じ結果が得られます。1 つ目はリストの作成、2 つ目は辞書の作成です。ディクショナリを作成するコードは次のようになります。

myvocab = {}
vocabulary = []

count = 0

for row in results:
    skillName = re.sub(r'&#?[a-z0-9]+;', ' ', row['SkillName']) 
    skillName = unicode(skillName,"utf-8")  
    vocabulary.append(skillName)  #Using a list 
    myvocab[str(skillName)] = count #Using a dictionary
    count+=1

次に、次のように TfidfVectorizer でボキャブラリ (リスト バージョンまたは辞書のいずれか、どちらも最後に同じ結果が得られます) を使用します。

vectorizer = TfidfVectorizer(max_df=0.8, 
                         stop_words='english' ,ngram_range=(1,2) ,vocabulary=myvocab)
X = vectorizer.fit_transform(dataset2)

X の形状は (651, 24321) です。これは、クラスター化するインスタンスが 651 個あり、語彙に 24321 個の単語があるためです。

X の内容を出力すると、次のようになります。

(14, 11462) 1.0
(20, 10218) 1.0
(34, 11462) 1.0
(40, 11462) 0.852815313278
(40, 10218) 0.52221264006
(50, 11462) 1.0
(81, 11462) 1.0
(84, 11462) 1.0
(85, 11462) 1.0
(99, 10218) 1.0
(127, 11462)    1.0
(129, 10218)    1.0
(132, 11462)    1.0
(136, 11462)    1.0
(138, 11462)    1.0
(150, 11462)    1.0
(158, 11462)    1.0
(186, 11462)    1.0
(210, 11462)    1.0

:   :

ご覧のとおり、ほとんどの場合、ボキャブラリの単語のみが存在し (少なくとも 10 個あるため、これは誤りです)、多くの場合、単語が 1 つも見つかりません。また、見つかった単語はインスタンス間で常に同じになる傾向があり、これは意味がありません。

を使用してfeature_namesを印刷すると:

feature_names = np.asarray(vectorizer.get_feature_names())

私は得る:

['.NET' '10K' '21 CFR Part 11' ..., 'Zend Studio' 'Zendesk' 'Zenworks']

使用されたボキャブラリが入力ドキュメントから決定されたものである場合、プログラムは完全に実行されていたと言わざるを得ないため、問題はカスタム ボキャブラリの使用に関連していると強く疑われます。

何が起こっているのか手がかりを持っている人はいますか?

(私はパイプラインを使用していないため、この問題は既に修正されている以前のバグとは関係ありません)

4

3 に答える 3

1

私が珍しいと思うことの 1 つは、ベクトライザーを作成するときに指定することですngram_range=(1,2)'21 CFR Part 11'これは、標準のトークナイザーを使用して機能を取得できないことを意味します。「欠落している」機能は の n-gram であると思われn>2ます。事前に選択した語彙項目のうち、ユニグラムまたはバイグラムはいくつありますか?

于 2013-02-20T18:12:52.313 に答える
0

min_df=2これは、データセットで少なくとも 2 回発生していない場合、ボキャブラリから機能を除外するという (おそらく紛らわしい) デフォルト値が原因であると確信しています。コードで明示的に設定して確認できますmin_df=1か?

于 2013-02-20T21:57:26.117 に答える
-1

Python の for-in ループでは、count+=1 を使用して、ループごとにカウントに 1 を加算することができませんでした。for i in range(n): を使用して、それを置き換えることができます。count の値は 1 のままになるためです。

于 2015-07-07T16:18:50.353 に答える