Как сделать взвешенную униграмму / биграмму / триграмму, используя CountVectorizer с весами (из значения столбца) вместо счетчика? - PullRequest
0 голосов
/ 10 июня 2019

Мой набор данных содержит блок текста, а также столбец с суммарным количеством и выглядит так:

текст, количество (имя столбца)

это мой дом, 100

где я, 10

это кусок пирога, 2

Код, который я получил через интернетпостроить униграмму

def get_top_n_words(corpus, n=None):
    vec = sk.feature_extraction.text.CountVectorizer().fit(corpus)
    bag_of_words = vec.transform(corpus)
    sum_words = bag_of_words.sum(axis=0) 
    words_freq = [(word, sum_words[0, idx]) for word, idx in vec.vocabulary_.items()]
    words_freq =sorted(words_freq, key = lambda x: x[1], reverse=True)
    return words_freq[:n]
common_words = get_top_n_words(df['text'], 20)

Со стандартным CountVectorizer я бы создал униграмму, которая выглядит следующим образом:

это 2

равно 2

my 1

, где 1

am 1 i 1

a 1

часть 1

из 1

торт 1

Я надеюсь, что вместо этого он может быть взвешен по его количеству, так как это суммарный счет, то есть:

это 102

102

мои 100

где 10

утра 10

i 10

2

часть 2

из 2

торт 2

Возможно ли это?

1 Ответ

0 голосов
/ 10 июня 2019

Что вы можете сделать, это использовать метод toarray после transform, чтобы иметь возможность выполнять умножение матриц на значение счетчика после:

def get_top_n_words(corpus, count, n=None): # add the parameter with the count values
    vec = feature_extraction.text.CountVectorizer().fit(corpus)
    # here multiply the toarray of transform with the count values
    bag_of_words = vec.transform(corpus).toarray()*count.values[:,None] 
    sum_words = bag_of_words.sum(axis=0) 
    # accessing the value in sum_words is a bit different but still related to idx
    words_freq = [(word, sum_words[idx]) for word, idx in vec.vocabulary_.items()] 
    words_freq =sorted(words_freq, key = lambda x: x[1], reverse=True)
    return words_freq[:n]

common_words = get_top_n_words(df['text'], df['count'], 20)
print (common_words)
[('this', 102),
 ('is', 102),
 ('my', 100),
 ('home', 100),
 ('where', 10),
 ('am', 10),
 ('piece', 2),
 ('of', 2),
 ('cake', 2)]
...