Чистая реализация панд TF-IDF - PullRequest
0 голосов
/ 24 октября 2018

Мне интересно, почему моя реализация TF-IDF для Pandas показывает несколько отличные результаты от реализации sklearn.

Вот моя реализация:

text = ["aa bb cc dd ee", "bb cc dd dd"]

terms = [Counter(t.split(' ')) for t in text]
tf = pd.DataFrame(terms)
tf = tf.fillna(0)

num_docs = len(text)
idf = np.log(num_docs / tf[tf >= 1].count()) + 1 

tf_idf = tf * idf

norm = np.sqrt((tf_idf ** 2).sum(axis=1))
norm_tf_idf = tf_idf.div(norm, axis=0)

>>> norm_tf_idf
         aa        bb        cc        dd        ee
0  0.572929  0.338381  0.338381  0.338381  0.572929
1  0.000000  0.408248  0.408248  0.816497  0.000000

Однако, если я использую sklearn:

tf = TfidfVectorizer(smooth_idf=False, stop_words=None, sublinear_tf=True)
x = tf.fit_transform(text)

sk = pd.DataFrame(x.toarray())
sk.columns = tf.get_feature_names()
sk

>>> sk
         aa        bb        cc        dd        ee
0  0.572929  0.338381  0.338381  0.338381  0.572929
1  0.000000  0.453295  0.453295  0.767495  0.000000

Или если мы вычтем их:

>>> norm_tf_idf - sk
    aa        bb        cc        dd   ee
0  0.0  0.000000  0.000000  0.000000  0.0
1  0.0 -0.045046 -0.045046  0.049002  0.0

Редактировать:

Я обнаружил, что sklearn idf не совсем то же самое, что и мой idf, номы можем отнести это к точности с плавающей запятой, я думаю:

sklearn idf: [1.69314718 1.         1.         1.         1.69314718]
my idf:      [1.693147   1.000000   1.000000   1.000000   1.693147]

И даже если я использую sklearn idf, я все равно получу другие результаты.

Кроме того, если я не нормализую ииспользуйте значения sklearn idf, только TF-IDF для dd второго документа отличается:

sk_tfv = TfidfVectorizer(smooth_idf=False, stop_words=None, token_pattern=r"(?u)\b\w+\b", sublinear_tf=True, norm=None)
x = sk_tf.fit_transform(text)
sk_tf_idf = pd.DataFrame(x.toarray())
...
idf = sk_tfv.idf_
tf_idf = tf * idf


>>> tf_idf - sk_tf_idf
     aa  bb  cc       dd     ee
0   0.0 0.0 0.0 0.000000    0.0
1   0.0 0.0 0.0 0.306853    0.0

Это означает две вещи:
1. Проблема в моем TF.Однако это легко проверить и, похоже, это не так.Или
2. sklearn не просто делает TF * IDF, но делает что-то большее, на что я должен обратить внимание.

1 Ответ

0 голосов
/ 24 октября 2018

Я тупой.После погружения в источник sklearn я заметил параметр sublinear_tf.Если для этого параметра установлено значение «Истина», термин «частота» заменяется на log(TF) + 1, и просто случается так, что я установил для этого параметра значение True:)

Для реализации сублинейного ТФ в пандах это должно работать:

tf[tf > 0]  = np.log(tf[tf > 0] ) + 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...