Невозможно тренировать модель в Наивном Байесе - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь классифицировать электронную почту как спам / хам, используя NLTK

Ниже приведены следующие шаги:

  1. Пытается извлечь все токены

  2. Выбор всех функций

  3. Извлечение признаков из совокупности всех уникальных слов и сопоставление Правда / ложь

  4. Подготовка данных в наивном байесовском классификаторе

from nltk.classify.util import apply_features
from nltk import NaiveBayesClassifier
import pandas as pd
import collections
from sklearn.model_selection import train_test_split
from collections import Counter
data = pd.read_csv('https://raw.githubusercontent.com/venkat1017/Data/master/emails.csv')

"""fetch array of tuples where each tuple is defined by (tokenized_text, label)
"""

processed_tokens=data['text'].apply(lambda x:([x for x in x.split() if x.isalpha()]))
processed_tokens=processed_tokens.apply(lambda x:([x for x in x if len(x)>3]))

processed_tokens = [(i,j) for i,j in zip(processed_tokens,data['spam'])]



"""
 dictword return a Set of unique words in complete corpus.
"""

list = zip(*processed_tokens)

dictionary = Counter(word for i, j in processed_tokens for word in i)

dictword = [word for word, count in dictionary.items() if count == 1]


"""maps each input text into feature vector"""

y_dict = ( [ (word, True) for word in dictword] )
feature_vec=dict(y_dict)

"""Training"""

training_set, testing_set = train_test_split(y_dict, train_size=0.7)

classifier = NaiveBayesClassifier.train(training_set)

    ~\AppData\Local\Continuum\anaconda3\lib\site-packages\nltk\classify\naivebayes.py in train(cls, labeled_featuresets, estimator)
    197         for featureset, label in labeled_featuresets:
    198             label_freqdist[label] += 1
--> 199             for fname, fval in featureset.items():
    200                 # Increment freq(fval|label, fname)
    201                 feature_freqdist[label, fname][fval] += 1

AttributeError: 'str' object has no attribute 'items'

Я сталкиваюсь со следующей ошибкой при попытке обучить корпус уникальных слов

1 Ответ

0 голосов
/ 05 ноября 2018

Во-первых, я надеюсь, вы знаете, что y_dict - это просто словарь, который отображает слова (строки), которые встречались в корпусе только один раз, как ключи к значению True. Вы передаете его в качестве обучающего набора классификатору, тогда как вы должны передать tuple of (особенность dict каждой строки текста) и (соответствующую метку). Пока ваш классификатор должен получать [({'feat1': 'value1', ... }, label_value), ...] в качестве входных данных, вы передаете [ ('word1', True), ... ]. Тип string не имеет атрибута items, только dict. Отсюда и ошибка.

Во-вторых, ваше моделирование данных неверно. Ваш обучающий набор должен состоять из набора функций, полученного из data['text'], сопоставленного со значением data['spam'] (так как это ваша метка). Пожалуйста, посмотрите, как выполнить классификацию документов с помощью классификаторов nltk в разделе 1.3 здесь .

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