2013-05-10 6 views
0

Я пытаюсь использовать nltk наивный классификатор для классификации жанров фильмов. Однако я получаю некоторые странные результаты. В настоящее время это только догадки, основанные на количестве введенного жанра.NLTK Наивные заливы Классификатор странных результатов

Если я ввожу два боевика и одну комедию, каждая догадка будет действовать. Естественно, я хочу, чтобы на основе введенного текста:

def RemoveStopWords(wordText): 
    keep_list = [] 
    for word in wordText: 
     if word not in wordStop: 
      keep_list.append(word.lower()) 

    return set(keep_list) 

def getFeatures(element): 

    splitter=re.compile('\\W*') 
    f = {} 
    plot = [s for s in RemoveStopWords(splitter.split(element['imdb']['plot'])) 
    if len(s)>5 and len(s) < 15] 

    for w in plot: 
      f[w]= w 

    return f 

def FindFeaturesForList(MovieList): 
    featureSet = [] 
    for w in MovieList: 
     print w['imdb']['title'] 
     try: 
      for genre in w['imdb']['genres']: 
       featureSet.append((getFeatures(w), genre)) 
     except: 
      print "Error when retriving genre, skipping element" 

    return featureSet 

featureList = FindFeaturesForList(trainset) 
cl = nltk.NaiveBayesClassifier.train(featureList) 

Так что, когда я делаю cl.classify (фильм) возвращает наиболее часто введенный жанр, что я делаю не так?

+1

Использование двух комедий и один боевик кажется слишком маленьким обучающим множество. Пробовали ли вы тренировать классификатор с * как минимум * несколькими сотнями фильмов? – unutbu

+0

Да, я пробовал несколько сотен, но, глядя на данные, предположение является эксклюзивным, исходя из количества жанров, а не введенного текста. – TheTango

+0

Можете ли вы опубликовать 'cl.show_most_informative_features (5)'? – unutbu

ответ

0

В обзоре фильма classification example в книге nltk указано, что частота всех слов из всех фильмов была собрана, а затем только самые распространенные слова были выбраны как функциональные клавиши.

all_words = nltk.FreqDist(w.lower() for w in movie_reviews.words()) 
word_features = all_words.keys()[:2000] 

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

Во всяком случае, возможно, попробуйте использовать ту же идею в своем классификаторе:

def getFeatures(text, word_features): 
    text = text.lower() 
    f = {word: word in text for word in word_features} 
    return f 


def FindFeaturesForList(MovieList): 
    featureSet = [] 
    splitter = re.compile('\\W*') 
    all_words = nltk.FreqDist(
     s.lower() 
     for w in MovieList 
     for s in RemoveStopWords(splitter.split(w['imdb']['plot'])) 
     if len(s) > 5 and len(s) < 15) 
    word_features = all_words.keys()[:2000] 
    for w in MovieList: 
     print w['imdb']['title'] 
     try: 
      for genre in w['imdb']['genres']: 
       featureSet.append(
        (getFeatures(w['imdb']['plot'], word_features), genre)) 
     except: 
      print "Error when retriving genre, skipping element" 

    return featureSet 
+0

Привет, спасибо за отзыв. Я определенно вижу идею этого. И это может улучшить классификатор. Но в настоящее время это не меняет результат. - каждый ввод в настоящее время считается одним и тем же жанром. Каков жанр, который классифицировался в большинстве случаев. – TheTango

+0

@ TheTango Вы должны стараться, чтобы ваш тренировочный набор сбалансирован. Я не знаю никакой «официальной» позиции по количеству случаев, которые вы должны иметь при обучении модели. Но из моего опыта я всегда находил лучшую точность, когда у меня одинаковое количество выборок для каждого выходного класса. Когда у меня есть неуравновешенный набор, я вижу снижение производительности. – Steve

+0

@steve - это то, что набор тренировок должен быть сбалансирован? я всегда предполагал, что вам нужно определенное количество предметов из каждого класса, но не должно возиться с алгоритмом, не так ли? – patrick

Смежные вопросы