Непонимание использования filter_extreme в gensim

import gensim
corpus = [["a","b","c"],["a","d","e"],["a","f","g"]]
from gensim.corpora import Dictionary
dct = Dictionary(corpus)
print(dct)
dct.filter_extremes(no_below=1)
print(dct)

Когда я запускал код выше, мой результат был -

Dictionary(7 unique tokens: ['a', 'b', 'c', 'd', 'e']...)
Dictionary(6 unique tokens: ['b', 'c', 'd', 'e', 'f']...)

Я предположил, что, поскольку «а» встречается в двух документах, его не следует удалять. Однако, это не так. Я что-то пропустил?

Всего 1 ответ


Посмотрев документацию filter_extremes :

filter_extremes(no_below=5, no_above=0.5, keep_n=100000, keep_tokens=None)

Notes:    
This removes all tokens in the dictionary that are:

    1. Less frequent than no_below documents (absolute number, e.g. 5) or
    2. More frequent than no_above documents (fraction of the total corpus size, e.g. 0.3).
    3. After (1) and (2), keep only the first keep_n most frequent tokens (or keep all if keep_n=None).

Вы пропускаете no_below=1 . Это означает, что токены, появляющиеся в менее чем 1 документе (из 3), удаляются. Это означает, a остаетесь, как и любой другой токен в вашем корпусе.

Но тогда no_above=0.5 проверяется в соответствии со своим значением по умолчанию, так как вы не no_above=0.5 явное значение для этого ключевого слова. Это означает, что токены, появляющиеся в более чем 50% документов (из 3, т. Е. Те, которые появляются не менее 2), будут удалены. И 'a' появляется во всех трех документах, это единственное, что есть, по крайней мере, в двух документах. Вот почему этот токен и только этот токен удаляются из результата. (Значение 10000 по умолчанию для keep_n подразумевает, что шаг 3 - это не-op в примере вашего примера.)

Если вы хотите только no_above=1.0 низкочастотные экстремальные токены, передайте явное значение no_above=1.0 для filter_extremes .


Есть идеи?

10000