Классификация текстовых строк на несколько классов с использованием Naive Bayes с NLTK

В настоящее время я использую Naive Bayes, чтобы классифицировать кучу текстов. У меня несколько категорий. Сейчас я просто выводя назад вероятность и категорию, но то, что я хотел бы сделать, это ранжировать категории, основанные на задних вероятностях, и использовать категории 2-го, 3-го места в качестве «резервных» категорий.

Вот пример:

df = pandas.DataFrame({ 'text' : pandas.Categorical(["I have wings","Metal wings","Feathers","Airport"]), 'true_cat' : pandas.Categorical(["bird","plane","bird","plane"])})

text           true_cat
-----------------------
I have wings   bird
Metal wings    plane
Feathers       bird
Airport        plane

Что я делаю:

new_cat = classifier.classify(features(text))
prob_cat = classifier.prob_classify(features(text))

Конечный результат:

new_cat prob_cat    text           true_cat
bird    0.67        I have wings   bird
bird    0.6         Feathers       bird
bird    0.51        Metal wings    plane
plane   0.8         Airport        plane

Я нашел пару примеров, используя classify_many и prob_classify_many, но поскольку я новичок в Python, у меня возникли проблемы с переводом его на мою проблему. Я не видел, чтобы он использовался с пандами где угодно.

Я хочу, чтобы это выглядело так:

df_new = pandas.DataFrame({'text': pandas.Categorical(["I have wings","Metal wings","Feathers","Airport"]),'true_cat': pandas.Categorical(["bird","plane","bird","plane"]), 'new_cat1': pandas.Categorical(["bird","bird","bird","plane"]), 'new_cat2': pandas.Categorical(["plane","plane","plane","bird"]), 'prob_cat1': pandas.Categorical(["0.67","0.51","0.6","0.8"]), 'prob_cat2': pandas.Categorical(["0.33","0.49","0.4","0.2"])})


new_cat1    new_cat2    prob_cat1   prob_cat2   text           true_cat
-----------------------------------------------------------------------
bird        plane       0.67        0.33        I have wings   bird
bird        plane       0.51        0.49        Metal wings    plane
bird        plane       0.6         0.4         Feathers       bird
plane       bird        0.8         0.2         Airport        plane

Любая помощь будет оценена по достоинству.

python,pandas,nltk,naivebayes,

0

Ответов: 2


1 принят

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

prob_cat.prob("bird")

Здесь prob_cat- распределение вероятности nltk ( ProbDist). Вы можете получить все категории дискретно ProbDistи их вероятность:

probs = list((x, prob_cat.prob(x)) for x in prob_cat.samples())

Поскольку вы уже знаете категории, с которыми вы обучались, вы можете использовать предопределенный список, а не prob_cat.samples(). Наконец, вы можете заказать их от максимально возможного до наименее вероятного в одном выражении:

mycategories = ["bird", "plane"]
probs = sorted(((x, prob_cat.prob(x)) for x in mycategories), key=lambda tup: -tup[1])

0

Я начинаю туда добираться.

#This gives me the probability it's a bird.
prob_cat.prob(bird)

#This gives me the probability it's a plane.
prob_cat.prob(plane)

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

питон, панды, NLTK, naivebayes,
Похожие вопросы