Наивный байесовский классификатор - пустой словарь

Я пытаюсь использовать Наивный Байес для обнаружения юмора в текстах. У меня есть этот код, взятый из здесь, но у меня есть некоторые ошибки, и я не не знаю, как их решить, потому что я новичок в машинном обучении и этих алгоритмах. Мои данные о поездах содержат однострочники. Я знаю, что другие задают тот же вопрос, но я пока не нашел ответа.

import os
import io
from pandas import DataFrame
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB


def readFiles(path):
    for root, dirnames, filenames in os.walk(path):
        for filename in filenames:
            path = os.path.join(root, filename)

            inBody = False
            lines = []
            f = io.open(path, 'r', encoding='latin1')
            for line in f:
                if inBody:
                    lines.append(line)
                elif line == '\n':
                    inBody = True
            f.close()
            message = '\n'.join(lines)
            yield path, message


def dataFrameFromDirectory(path, classification):
    rows = []
    index = []
    for filename, message in readFiles(path):
        rows.append({'message': message, 'class': classification})
        index.append(filename)

    return DataFrame(rows, index=index)


data = DataFrame({'message': [], 'class': []})

data = data.append(dataFrameFromDirectory('G:/PyCharmProjects/naive_bayes_classifier/train_jokes', 'funny'))
data = data.append(dataFrameFromDirectory('G:/PyCharmProjects/naive_bayes_classifier/train_non_jokes', 'notfunny'))

vectorizer = CountVectorizer()
counts = vectorizer.fit_transform(data['message'].values)

classifier = MultinomialNB()
targets = data['class'].values
classifier.fit(counts, targets)

examples = ['Where do steers go to dance?  The Meat Ball', 'tomorrow I press this button']
examples_counts = vectorizer.transform(examples)
predictions = classifier.predict(examples_counts)

print(predictions)

И ошибки:

Traceback (most recent call last):
  File "G:/PyCharmProjects/naive_bayes_classifier/NaiveBayesClassifier.py", line 55, in <module>
    counts = vectorizer.fit_transform(data['message'].values)
  File "C:\Users\mr_wizard\AppData\Local\Programs\Python\Python36\lib\site-packages\sklearn\feature_extraction\text.py", line 869, in fit_transform
    self.fixed_vocabulary_)
  File "C:\Users\mr_wizard\AppData\Local\Programs\Python\Python36\lib\site-packages\sklearn\feature_extraction\text.py", line 811, in _count_vocab
    raise ValueError("empty vocabulary; perhaps the documents only"
ValueError: empty vocabulary; perhaps the documents only contain stop words

Вот некоторые данные от train_jokes

"[me narrating a documentary about narrators] ""I can't hear what they're saying cuz I'm talking"""
"Telling my daughter garlic is good for you. Good immune system and keeps pests away.Ticks, mosquitos, vampires... men."
I've been going through a really rough period at work this week It's my own fault for swapping my tampax for sand paper.
"If I could have dinner with anyone, dead or alive... ...I would choose alive. -B.J. Novak-"
Two guys walk into a bar. The third guy ducks.
Why can't Barbie get pregnant? Because Ken comes in a different box. Heyooooooo
Why was the musician arrested? He got in treble.
Did you hear about the guy who blew his entire lottery winnings on a limousine? He had nothing left to chauffeur it.
What do you do if a bird shits on your car? Don't ask her out again.
He was a real gentlemen and always opened the fridge door for me

train_jokes содержит около 250 000 острот или твитов, а train_non_jokes содержит простые предложения, которые не кажутся смешными. На данный момент у меня нет готового не смешного файла, только несколько предложений из Твиттера.


person Mr. Wizard    schedule 04.03.2018    source источник
comment
Можете ли вы опубликовать пример того, как выглядит df?   -  person Vivek Kalyanarangan    schedule 04.03.2018
comment
я отредактировал свой пост   -  person Mr. Wizard    schedule 04.03.2018
comment
Попробуйте распечатать data['message'].values ​​после добавления, действительно ли он хорошо вставляет сообщение и метку в DF?   -  person Touhidul Alam    schedule 04.03.2018
comment
Ооо, это пусто []   -  person Mr. Wizard    schedule 04.03.2018
comment
Затем попробуйте выполнить отладку внутри функции dataFrameFromDirectory, возможно, если DF правильно выбирает путь.   -  person Touhidul Alam    schedule 04.03.2018
comment
Ваши тренировочные данные довольно зашумлены. Одна строка имеет в конце атрибуцию, а другая строка имеет в конце Heyooooooo, что не кажется существенной частью текста (и кажется мне бессмысленным). Есть и самодельные устройства с многоточием. Является ли частью задачи определение юмора по зашумленным данным?   -  person halfer    schedule 19.03.2018


Ответы (1)


Проблема была не в коде, а в данных поезда. Во-первых, G:/PyCharmProjects/naive_bayes_classifier/train_jokes и G:/PyCharmProjects/naive_bayes_classifier/train_non_jokes должны быть путями к каталогам, в которых находятся файлы с данными о поездах (поэтому train_jokes и train_non_jokes — это каталоги). С другой стороны, в моем файле не было новой строки, поэтому переменная inBody всегда была ложной. Чтобы программа работала, данные поезда должны были быть такими:

text here and then blank line

another text

and this is it

(Я только что удалил ссылку на inBody, и это решило новую строку). Вот некоторые детали, которые я упустил из-за того, что смотрел это видео, потому что он этого не говорил. Всем спасибо за ответы, очень помогли.

person Mr. Wizard    schedule 05.03.2018