Используя NLTK / NaiveBayesClassifier, всегда получая положительный результат на тестовых данных - PullRequest
0 голосов
/ 05 июля 2018

Я недавно начал пытаться изучать машинное обучение и следовал учебному пособию, в котором была создана модель, которая могла бы определить, был ли введенный твит положительным или отрицательным. Программа работала прилично, но она была не очень точной, и я пока не хотел заниматься работой с API Twitter, поэтому я попытался преобразовать программу, чтобы предсказать позицию обзора фильма (положительную / отрицательную). Я подумал, что это будет проще, и как только я заработаю, я смогу попробовать Twitter.

Тем не менее, теперь, когда я, наконец, запустил его и начал работать, я всегда получаю «позитивный» результат, мои данные о тренировке представляют собой набор из 400 позитивных и 400 негативных рецензий на фильмы.

Вот откуда я взял свой набор данных: (точная ссылка - первая в разделе «Наборы данных о полярности настроений», называемая «Набор данных о полярности v2.0 (3.0Mb)». http://www.cs.cornell.edu/people/pabo/movie-review-data/

Я не использовал все 2000 отзывов, только первые 400 из положительных и 400 из отрицательных.

import nltk
import glob
import errno


path = r"C:\Users\Thomas\tweets\pos\*.txt"
files = glob.glob(path)

pos_rev = []
neg_rev = []
for name in files:
    try:
        with open(name) as f:
            content = f.read()
            pos_rev.append((content, 'positive'))

    except IOError as exc:
        if exc.errno != errno.EISDIR:
            raise
for name in files:
    try:
        with open(name) as f:
            content = f.read()
            neg_rev.append((content, 'negative'))
    except IOError as exc:
        if exc.errno != errno.EISDIR:
            raise
# create array to store all reviews
reviews = []

# seperate reviews into individual words, removing words 2 words or less
# create training set (reviews)
for (words, sentiment) in pos_rev + neg_rev:
    words_filtered = [e.lower() for e in words.split() if len(e) >= 3]
    reviews.append((words_filtered, sentiment))




def get_words_in_reviews(reviews):
    all_words = []
    for (words, sentiment) in reviews:
        all_words.extend(words)
    return all_words
def get_word_features(wordlist):
    wordlist = nltk.FreqDist(wordlist)
    word_features = wordlist.keys()
    return word_features

word_features = get_word_features(get_words_in_reviews(reviews))

def extract_features(document):
    document_words = set(document)
    features = {}
    for word in word_features:
        features['contains(%s)' % word] = (word in document_words)
    return features

training_set = nltk.classify.apply_features(extract_features, reviews)
classifier = nltk.NaiveBayesClassifier.train(training_set)

review = 'That movie was very bad.  Poor directing, terrible acting and horrible production.'
print(classifier.classify(extract_features(review.split())))

Независимо от того, что я положил в классификатор, он всегда возвращается положительным.

Кроме того, если здесь кто-то еще читает, что именно это делает:

except IOError as exc:
    if exc.errno != errno.EISDIR:
        raise

Я знаю, что это происходит в случае ошибки при попытке открыть файлы, но есть ли что-то существенное, что я должен знать о IOError, .errno,! = И поднять? Или это просто стандарт, кроме блока при чтении в файлах?

Заранее спасибо за любую помощь!

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