sklearn.feature_selection chi2 определяет одинаковые униграммы и биграммы для разных меток - PullRequest
0 голосов
/ 18 июня 2020

Я использовал код, который я нашел в Интернете по мультиклассификации с помощью scikit: https://towardsdatascience.com/multi-class-text-classification-with-scikit-learn-12f1e60e0a9f. Я использовал свой собственный набор данных, который состоит из твитов, относящихся к разжиганию ненависти, в любом случае я пытался найти термины, которые наиболее коррелируют с каждым из моих ярлыков. Этикетки обозначены как Ненависть и Ненависть . Результаты, которые я получил для наиболее коррелированных униграмм и биграмм для обеих меток, абсолютно одинаковы. Мне просто интересно, что не так? ive попытался использовать набор данных, предоставляемый веб-сайтом, и он отлично с этим работает.

мои результаты выглядят так:

# 'Non-Hate':
  . Most correlated unigrams:
. idiot
. stupid
  . Most correlated bigrams:
. fucking idiot
. fucking bitch
# 'Non-Hate':
    . Most correlated unigrams:
. idiot
. stupid
  . Most correlated bigrams:
. fucking idiot
. fucking bitch

используемый код:

df['category_id'] = df['Code'].factorize()[0]
category_id_df = df[['Code', 'category_id']].drop_duplicates().sort_values('category_id')
category_to_id = dict(category_id_df.values)
id_to_category = dict(category_id_df[['category_id', 'Code']].values)
df.head()


from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(sublinear_tf=True, min_df=3, norm='l2', encoding='latin-1', ngram_range=(1, 2), stop_words='english')
features = tfidf.fit_transform(df.Tweet).toarray()
labels = df.category_id
features.shape
from sklearn.feature_selection import chi2
import numpy as np
N = 2
for Code, category_id in sorted(category_to_id.items()):
  features_chi2 = chi2(features, labels == category_id)
  indices = np.argsort(features_chi2[0])
  feature_names = np.array(tfidf.get_feature_names())[indices]
  unigrams = [v for v in feature_names if len(v.split(' ')) == 1]
  bigrams = [v for v in feature_names if len(v.split(' ')) == 2]
  print("# '{}':".format(Code))
  print("  . Most correlated unigrams:\n. {}".format('\n. '.join(unigrams[-N:])))
  print("  . Most correlated bigrams:\n. {}".format('\n. '.join(bigrams[-N:])))

1 Ответ

0 голосов
/ 18 июня 2020

Всего с двумя классами эти должны совпадать. Тест хи-квадрат находит наиболее различающие (в некотором смысле) особенности между двумя классами. Ваша ссылка отличается, потому что используемая цель (labels == category_id) - это дискриминация один против остальных. Униграмма / биграмма, которая очень указывает на то, что не находится в классе, по-прежнему будет иметь высокое значение теста chi2 для этого класса.

...