RegEx в словаре не работает в sklearn TfidfVectorizer - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь вычислить tf-idf выбранных слов в корпусе, но это не сработало, когда я использую регулярное выражение для выбранных слов.

Ниже приведен пример, который я скопировал из других вопросов в stackoverflow и внес небольшие изменения, чтобы отразить мой вопрос.

Код вставлен ниже. Код работает, если я пишу «шоколад» и «шоколадные конфеты» отдельно, но не работает, если я пишу «шоколад | шоколад».

Может кто-нибудь помочь мне понять, почему и предложить возможные решения этой проблемы?

keywords = ['tim tam', 'jam', 'fresh milk', 'chocolate|chocolates', 'biscuit pudding']
corpus = {1: "making chocolate biscuit pudding easy first get your favourite biscuit chocolates", 2: "tim tam drink new recipe that yummy and tasty more thicker than typical milkshake that uses normal chocolates", 3: "making chocolates drink different way using fresh milk egg"}
tfidf = TfidfVectorizer(vocabulary = keywords, stop_words = 'english', ngram_range=(1,3))
tfs = tfidf.fit_transform(corpus.values())
feature_names = tfidf.get_feature_names()
corpus_index = [n for n in corpus]
rows, cols = tfs.nonzero()
for row, col in zip(rows, cols):
    print((feature_names[col], corpus_index[row]), tfs[row, col])
tfidf_results = pd.DataFrame(tfs.T.todense(), index=feature_names, columns=corpus_index).T

Я ожидаю, что результаты будут:

('biscuit pudding', 1) 0.652490884512534
('chocolates', 1) 0.3853716274664007
('chocolate', 1) 0.652490884512534
('chocolates', 2) 0.5085423203783267
('tim tam', 2) 0.8610369959439764
('chocolates', 3) 0.5085423203783267
('fresh milk', 3) 0.8610369959439764

Но теперь возвращается:

('biscuit pudding', 1) 1.0
('tim tam', 2) 1.0
('fresh milk', 3) 1.0

1 Ответ

0 голосов
/ 19 апреля 2019

Я предполагаю, что вы используете TfidfVectorizer из scikit-learn. Если вы внимательно прочитали документацию , нигде не говорится, что вы можете использовать регулярные выражения в своем словаре, можете ли вы указать на вопрос, который вы упомянули, что вы скопировали?

Если вы хотите сгруппировать несколько терминов вместе вручную, вы можете указать отображение вместо итеративного в вашем словаре. Например:

keywords = {'tim tam':0, 'jam':1, 'fresh milk':2, 'chocolate':3, 'chocolates':3, 'biscuit pudding':4]

Обратите внимание, как chocolate и chocolates отображаются на один и тот же индекс.

...