У вас там много вопросов, но я постараюсь помочь.
Насколько я помню, 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.
Возможно, я что-то упускаю, но я не совсем уверен, что точно знаю, что вы ищете - рад изменить мой ответ.