Каковы смарттиры по умолчанию для gensim TfidfModel? - PullRequest
0 голосов
/ 30 мая 2018

Использование gensim:

from gensim.models import TfidfModel
from gensim.corpora import Dictionary

sent0 = "The quick brown fox jumps over the lazy brown dog .".lower().split()
sent1 = "Mr brown jumps over the lazy fox .".lower().split()

dataset = [sent0, sent1]
vocab = Dictionary(dataset)
corpus = [vocab.doc2bow(sent) for sent in dataset] 
model = TfidfModel(corpus)

# To retrieve the same pd.DataFrame format.
documents_tfidf_lol = [{vocab[word_idx]:tfidf_value for word_idx, tfidf_value in sent} for sent in model[corpus]]
documents_tfidf = pd.DataFrame(documents_tfidf_lol)
documents_tfidf.fillna(0, inplace=True)

documents_tfidf

[out]:

    dog mr  quick
0   0.707107    0.0 0.707107
1   0.000000    1.0 0.000000

Если мы выполняем вычисление TF-IDF вручную,

sent0 = "The quick brown fox jumps over the lazy brown dog .".lower().split()
sent1 = "Mr brown jumps over the lazy fox .".lower().split()

documents = pd.DataFrame.from_dict(list(map(Counter, [sent0, sent1])))
documents.fillna(0, inplace=True, downcast='infer')
documents = documents.apply(lambda x: x/sum(x))  # Normalize the TF.
documents.head()

# To compute the IDF for all words.
num_sentences, num_words = documents.shape

idf_vector = [] # Lets save an ordered list of IDFS w.r.t. order of the column names.

for word in documents:
  word_idf = math.log(num_sentences/len(documents[word].nonzero()[0]))
  idf_vector.append(word_idf)

# Compute the TF-IDF table.
documents_tfidf = pd.DataFrame(documents.as_matrix() * np.array(idf_vector), 
                               columns=list(documents))
documents_tfidf

[out]:

    .   brown   dog fox jumps   lazy    mr  over    quick   the
0   0.0 0.0 0.693147    0.0 0.0 0.0 0.000000    0.0 0.693147    0.0
1   0.0 0.0 0.000000    0.0 0.0 0.0 0.693147    0.0 0.000000    0.0

Если мы используем math.log2 вместо math.log:

    .   brown   dog fox jumps   lazy    mr  over    quick   the
0   0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0
1   0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0

Похоже gensim:

  • удалитьне характерные слова из модели TF-IDF, это очевидно, когда мы print(model[corpus])
  • , может быть, база журнала, кажется, отличается от log_2
  • , возможно, происходит некоторая нормализация.

Если посмотреть на https://radimrehurek.com/gensim/models/tfidfmodel.html#gensim.models.tfidfmodel.TfidfModel, разница в схеме smart будет иметь разные значения, но в документах неясно, что является значением по умолчанию.

Что такое smartirs по умолчанию для gensim TfidfModel?

Какие другие параметры по умолчанию вызвали разницу между встроенным TF-IDF и gensim?

1 Ответ

0 голосов
/ 02 января 2019

Значением по умолчанию smartirs является None, но если вы следуете коду, оно равно ntc .

Но как?

Во-первых, когда вы вызываете model = TfidfModel(corpus), он вычисляет IDF корпуса с помощью функции wglobal, которая объясняется в документах как:

wglobal - функция глобального взвешивания, значение по умолчанию: df2idf().df2idf - это функция, которая вычисляет IDF для термина с заданной периодичностью документа.Аргумент и формула по умолчанию для df2idf:

df2idf(docfreq, totaldocs, log_base=2.0, add=0.0)

df2idf formula

, который реализован как:

idfs = add + np.log(float(totaldocs) / docfreq) / np.log(log_base)

Один изsmartirs определяется: взвешивание частоты документа обратно-частота документа или idf.


wlocals по умолчанию identity функция,Термин частота корпусов прошел через функцию идентификации, которой ничего не произошло, и сам корпус вернулся.Следовательно, другой параметр умнее, термин частота взвешивания, является естественным или n.Теперь, когда у нас есть термин «частота» и «частота обратного документа», мы можем вычислить tfidf:

tfidf formula


normalizeпо умолчанию true, что означает, что после вычисления TfIDF он нормализует векторы tfidf.Нормализация выполняется с помощью l2-norm (евклидова единичная норма), что означает, что нашим последним умом является косинус или c.Эта часть реализована следующим образом:

# vec(term_id, value) is tfidf result
length = 1.0 * math.sqrt(sum(val ** 2 for _, val in vec))
normalize_by_length = [(termid, val / length) for termid, val in vec]

При вызове model[corpus] или model.__getitem__() происходят следующие вещи:

__getitem__ имеет аргумент eps, который является пороговым значением, которое удалит все записи, значения tfidf которых меньше eps.По умолчанию это значение равно 1e-12.В результате при печати векторов появлялись только некоторые из них.

...