いくつかのクラスタリング タスクのために 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']
使用されたボキャブラリが入力ドキュメントから決定されたものである場合、プログラムは完全に実行されていたと言わざるを得ないため、問題はカスタム ボキャブラリの使用に関連していると強く疑われます。
何が起こっているのか手がかりを持っている人はいますか?
(私はパイプラインを使用していないため、この問題は既に修正されている以前のバグとは関係ありません)