Как игнорировать положения слов в граммах при использовании CountVectorizer? - PullRequest
0 голосов
/ 02 марта 2020

У меня есть корпус, и я хотел бы получить частоту всех 2 граммов. Это код, который я использую:

vec = CountVectorizer(ngram_range=(2,2).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" содержит частоту каждого грамма в корпусе, например:

print(words_freq)
[('green apple', 10), ('yellow apple',2), ('apple green',5)]

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

Например, «зеленое яблоко» и «яблочно-зеленое» должны рассматриваться как один и тот же грамм и дают результат («зеленое яблоко», 15).

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 03 марта 2020

Вы можете использовать следующий фрагмент кода. Обратите внимание, что это будет работать только для биграмм.

words_freq = [('green apple', 10), ('yellow apple',2), ('apple green',5)]
alternate_words_freq = {}
for term, freq in words_freq:
    # Assume that bigrams are separated by a space
    # Reverse the bigram
    reverse_term = " ".join(term.split(" ")[::-1])

    if term in alternate_words_freq.keys():
        alternate_words_freq[term]+=freq
    elif reverse_term in alternate_words_freq.keys():
        alternate_words_freq[reverse_term]+=freq
    else:
        alternate_words_freq[term]=freq
# Prints [('green apple', 15), ('yellow apple', 2)]

print(list(alternate_words_freq.items()))
...