Я пытаюсь использовать пользовательский словарь в scikit-learn для некоторых задач кластеризации и получаю очень странные результаты.
Программа работает нормально, если не используется пользовательский словарь, и я доволен созданием кластера. Однако я уже определил группу слов (около 24 000), которые хотел бы использовать в качестве пользовательского словаря.
Слова хранятся в таблице SQL Server. Я пробовал до сих пор 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), а во многих случаях не найдено ни одного слова. Кроме того, найденные слова, как правило, всегда одинаковы в экземплярах, что не имеет смысла.
Если я напечатаю feature_names, используя:
feature_names = np.asarray(vectorizer.get_feature_names())
Я получил:
['.NET' '10K' '21 CFR Part 11' ..., 'Zend Studio' 'Zendesk' 'Zenworks']
Я должен сказать, что программа работала отлично, когда использовался словарь, определенный из входных документов, поэтому я сильно подозреваю, что проблема связана с использованием пользовательского словаря.
Кто-нибудь знает, что происходит?
(Я не использую конвейер, поэтому эта проблема не может быть связана с предыдущей ошибкой, которая уже исправлена)