Является ли tf-idf scikit-learn в этом примере правильным? Самые частые слова имеют высокий балл

Строки в Java неизменяемы. Это означает, что всякий раз, когда вы пытаетесь изменить / изменить строку, вы получаете новый экземпляр. Вы не можете изменить исходную строку. Это сделано для того, чтобы эти экземпляры строк могли кэшироваться. Типичная программа содержит множество ссылок на строки и кеширование этих экземпляров, что может уменьшить объем памяти и увеличить производительность программы.

При использовании оператора == для сравнения строк вы не сравниваете содержимое строки , но фактически сравнивают адрес памяти. Если они равны, в противном случае они вернут true и false. Если значение равно в строке, сравнивает содержимое строки.

Итак, вопрос в том, что все строки кэшируются в системе, как получается == возвращает false, тогда как equals возвращает true? Ну, это возможно. Если вы создадите новую строку, например String str = new String("Testing"), вы создадите новую строку в кеше, даже если в кеше уже содержится строка с тем же содержимым. Короче говоря, "MyString" == new String("MyString") всегда будет возвращать false.

Java также говорит о функции intern (), которая может использоваться в строке, чтобы сделать ее частью кеша, поэтому "MyString" == new String("MyString").intern() вернет true.

Примечание: == оператор намного быстрее, чем равен только потому, что вы сравниваете два адреса памяти, но вы должны быть уверены, что код не создает новые экземпляры String в коде. В противном случае вы столкнетесь с ошибками.

0
задан karel 10 March 2019 в 08:41
поделиться

1 ответ

tfidf = термин частота (tf) * обратная частота документа (idf)

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer 

vectorizer = CountVectorizer()
X = vectorizer.fit_transform(documents)
print(vectorizer.get_feature_names())
print (X.toarray())
print ("---")
t = TfidfTransformer(use_idf=True, norm=None, smooth_idf=False)
a = t.fit_transform(X)
print (a.toarray())
print ("---")
print (t.idf_)

Выход:

enter image description here

[ 116] idf (the) низкий, но tf (the, doc1) = 2 высокий, что толкает его на другие слова.

Из приведенного выше примера кода:

IDF (без норм, без сглаживания IDF) == the == 1

Однако tf (the, doc1) = 2 и tf (is, doc1) = 1, что увеличивает значение tfidf для tfidf (the, doc1).

аналогично idf (car) = 2.09861229, но tf (car, doc1) = 1, => tfidf (car, doc1) = 2.09861229, что очень близко к tfidf (the, doc1). Сглаживание IDF еще больше уменьшает разрыв.

На большом корпусе различия становятся более заметными.

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

tfidf_transformer = TfidfVectorizer (smooth_idf = False, use_idf = True, norm = None)

0
ответ дан mujjiga 10 March 2019 в 08:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: