TfIdf vectorizer, возвращающий положительные значения для отсутствующих слов - PullRequest
0 голосов
/ 28 апреля 2018

Я векторизовал корпус, используя векторизатор 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 Ответ

0 голосов
/ 02 мая 2018

Вы используете неправильный параметр столбцов в

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
...