TfIdf vectorizer, возвращающий положительные значения для отсутствующих слов
Я векторизовал корпус, используя векторизатор TfIdf в sklearn. Корпус большой, но данные более или менее выглядят так:
index speaker text
1 Bob 'this is sample text'
2 Dick 'also some sample words but different ones'
3 Jane 'stuff goes here that did not go above'
4 Mary 'my name is mary and my text is not being analyzed'
Я хочу выяснить, как значения TfIdf для слов разбиваются по динамикам для первых трех ораторов. Так что я:
from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer(stop_words=stemmed_stops)
word_vec = vec.fit_transform(df.loc[['Bob', 'Dick', 'Jane'], 'text'])
После векторизации корпуса я создал фрейм данных со значениями TfIdf, столбцами которых являются словарь:
speaker_vocab = pd.DataFrame(word_vec.toarray(), index=['Bob', 'Dick', 'Jane'], columns = vec.vocabulary_)
Это дает фрейм данных, который выглядит следующим образом:
this sample that my text ...
Bob 0.5 0.3 0.0 0.0 0.5
Проблема в том, что спикеры, которые никогда не используют определенные термины, получают положительные значения TfIdf для этих терминов. Например, если я посмотрю на слова для Джейн, я получу:
In: df.loc['Jane'].sort_values(ascending=False)
Out:
sample 0.32
goes .14
text .11
Похоже, что это происходит для всех ораторов, и слова положительные, которые никогда не появляются в их ряду. Положительные значения отличаются, но они остаются положительными.
В общем, есть ли причина, по которой векторизатор будет возвращать положительные значения для слов, не находящихся в одних и тех же строках динамика?
1 ответ
Вы используете неверный параметр столбцов в
speaker_vocab = pd.DataFrame(word_vec.toarray(),
index=['Bob', 'Dick', 'Jane'],
columns = vec.vocabulary_)
Согласно документации:
словарь_: dict
A mapping of terms to feature indices.
Dicts может вернуть предметы в произвольном порядке. Так это dict
может (не будет) давать имена в том же порядке, что и данные, возвращаемые в word_vec
,
Чтобы получить имена в точном порядке, используйте vec.get_feature_names()
,
speaker_vocab = pd.DataFrame(word_vec.toarray(),
index=['Bob', 'Dick', 'Jane'],
columns = vec.get_feature_names())
После этого вы получите правильный вывод.
speaker_vocab.loc['Jane'].sort_values(ascending=False)
#Output:
stuff 0.5
goes 0.5
go 0.5
above 0.5
words 0.0
this 0.0
text 0.0
sample 0.0
ones 0.0