Как использовать наивный байесовский классификатор после извлечения функций с использованием TF_IDF - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь классифицировать объекты, используя наивный байесовский классификатор, я использовал TF_IDF для извлечения объектов.

finaltfidfVector - это список векторов, каждый вектор представляет список чисел, 0, еслислово не найдено, иначе вес слова, если оно найдено.

И classlabels содержит все метки классов для каждого вектора.Я пытаюсь классифицировать его с помощью этого кода, но он не работает.

26652 строки для набора данных

from nltk.classify import apply_features

def naivebyse(finaltfidfVector,classlabels,reviews):

    train_set = []
    j = 0
    for vector in finaltfidfVector:
        arr={}
        if j<18697:
            arr[tuple(vector)] = classlabels[j]
            train_set.append((arr, reviews[j]))
            j += 1

    test_set = []
    j = 18697
    for vector in finaltfidfVector:
        arr = {}
        if j < 26652 and j>=18697:
            arr[tuple(vector)] = classlabels[j]
            test_set.append((arr, reviews[j]))
            j += 1

    classifier = nltk.NaiveBayesClassifier.train(train_set)
    print(nltk.classify.accuracy(classifier, test_set))

Выход:

0.0

Используется ссылка для TF_IDF и применяется к finaltfidfVector https://triton.ml/blog/tf-idf-from-scratch?fbclid=IwAR3UlCToGYFEQSmugXo3M5Q9fcld79JfXSfBaDG7wKv5a49O0ZDEft9DFNg. набор данных

это пример использованного набора данных перед предварительной обработкой и TF_IDF

Это пример первого вектора дляиндекс нуля в finaltfidfVector списке

[0.0,0.0, 0.0, 0.6214608098422192, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5115995809754083,0.0,0.0, 0.0, 0.0, 0.5521460917862246, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6214608098422192,0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6214608098422192, 0.0, 0.0, 0.0, 0.6214608098422192]

classlabels содержит метку класса для каждого вектора, 1 для сарказма 0 для не сарказма.Метка класса индекса 0 равна 1, это 1 для первого вектора в finaltfidfVector.

Первый элемент для train_set равен

({(0.0, 0.0, 1.3803652294655615,.....ect): '0'}, "former versace store clerk sues over secret 'black code' for minority shoppers")

1 Ответ

0 голосов
/ 10 июня 2019

Вот пример воспроизводимой игрушки:

# let's define a train_set
train_set = [
    ({'adam': 0.05,'is': 0.0, 'a': 0.0, 'good': 0.02, 'man': 0.0}, 1),
    ({'eve': 0.0, 'is':  0.0, 'a':  0.0,'good':  0.02,'woman': 0.0}, 1),
    ({'adam': 0.05, 'is': 0.0, 'evil': 0.0}, 0)]

Набор данных игрушки создается с использованием словаря оценок «tfidf», созданного вручную:

tfidf_dict = {
 'adam': 0.05,
 'eve': 0.05,
 'evil': 0.02,
 'kind': 0.02,
 'good': 0.02,
 'bad': 0.02
}

Где каждое известное слово имеет оценку tfidfи неизвестное слово имеет оценку 0. А также в train_set у нас есть положительная оценка для предложения, помеченного 1 («Адам - ​​добро»), и отрицательного, помеченного 0 («Адам - ​​зло»).

Теперь выполните тест:

import nltk
clf = nltk.NaiveBayesClassifier.train(train_set)

Посмотрите, как это работает на наборе игрушечных поездов:

>>> nltk.classify.accuracy(clf, train_set)
1.0

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...