Я недавно начал пытаться изучать машинное обучение и следовал учебному пособию, в котором была создана модель, которая могла бы определить, был ли введенный твит положительным или отрицательным. Программа работала прилично, но она была не очень точной, и я пока не хотел заниматься работой с 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,! = И поднять? Или это просто стандарт, кроме блока при чтении в файлах?
Заранее спасибо за любую помощь!