Наивный байесовский классификатор с использованием python - PullRequest
3 голосов
/ 13 марта 2012

Я использую scikit-learn для определения веса документа в Tf-idf, а затем использую Naive
Байесовский классификатор для классификации текста. Но Tf-IDF вес всех слов в документе отрицательны, за исключением нескольких. Но, насколько мне известно, отрицательные значения означают неважные термины. Так нужно ли передавать целые значения Tf-idf в байесовский классификатор? Если нам нужно пропустить только несколько из них, как мы можем это сделать? Кроме того, насколько лучше или хуже байесовский классификатор по сравнению с linearSVC? Есть ли лучший способ найти теги в тексте, кроме использования Tf-idf?

Спасибо

Ответы [ 3 ]

6 голосов
/ 13 марта 2012

Эта ошибка была исправлена ​​в основной ветке. Остерегайтесь, поскольку API текстового векторизатора тоже немного изменился, чтобы упростить настройку токенизации.

6 голосов
/ 13 марта 2012

У вас там много вопросов, но я постараюсь помочь.

Насколько я помню, TF-IDF не должен быть отрицательным значением. TF - это частота термина (как часто термин появляется в конкретном документе) и частота инверсии документа (количество документов в корпусе / количество документов, включающих этот термин). Это тогда обычно логарифмически взвешенный. Мы часто добавляем единицу к знаменателю, чтобы избежать деления на ноль. Следовательно, единственный раз, когда вы получите отрицательный tf * idf, это если термин встречается в каждом отдельном документе корпуса (что не очень полезно для поиска, как вы упомянули, поскольку не добавляет информации). Я бы дважды проверил ваш алгоритм.

данный термин t, документ d, корпус c:

tfidf = term freq * log(document count / (document frequency + 1))
tfidf = [# of t in d] * log([#d in c] / ([#d with t in c] + 1))

В машинном обучении наивный байесовский и SVM-файлы являются хорошими инструментами - их качество будет варьироваться в зависимости от приложения, и я выполнял проекты, в которых их точность оказалась сопоставимой. Наивного Байеса обычно довольно легко взломать вручную - я бы сначала попробовал, прежде чем углубляться в библиотеки SVM.

Возможно, я что-то упускаю, но я не совсем уверен, что точно знаю, что вы ищете - рад изменить мой ответ.

2 голосов
/ 13 марта 2012

Мне тоже интересна эта тема. Когда я использую классификацию baes (может быть, эта русская статья о алгоритме baes может помочь вам http://habrahabr.ru/blogs/python/120194/) Я использую только 20 главных слов документов. Я перепробовал много значений. В моих экспериментальных 20 лучших получить лучший результат. Также я изменил обычный tf-idf на это:

def f(word):
    idf = log10(0.5 / word.df)
    if idf < 0:
        idf = 0
    return word.tf * idf

В этом случае "плохие слова" равны 0.

...