feature_names.sort() TypeError: '<' не поддерживается между экземплярами 'str' и 'tuple'

Я пытаюсь классифицировать текст с помощью полиномиального классификатора с экстрактором функций Bigram. Коды следующие:

from nltk.classify.scikitlearn import SklearnClassifier
from sklearn.naive_bayes import MultinomialNB
from nltk.tokenize import word_tokenize

######### import for bigram########
import itertools
from nltk.collocations import BigramCollocationFinder
from nltk.metrics import BigramAssocMeasures

btagger=bangla_pos_tagger.BanglaTagger()

short_pos = open("short_reviews/pos.txt","r", encoding = 'utf8').read()
short_neg = open("short_reviews/neg.txt","r", encoding = 'utf8').read()

all_words = []
documents = []

allowed_word_types = ["JJ", "NN","NC","PP","NNP"]

for p in short_pos.split('\n\n'):
    words = word_tokenize(p)
    documents.append( (filtered_words, "pos") )
    pos = btagger.pos_tag(filtered_words)
    for w in pos:
        if w[1] in allowed_word_types:
            all_words.append(w[0])


for p in short_neg.split('\n\n'):
    words = word_tokenize(p)
    documents.append( (words, "neg") )
    pos = btagger.pos_tag(filtered_words)
    for w in pos:
        if w[1] in allowed_word_types:
            all_words.append(w[0])


all_words = nltk.FreqDist(all_words)
word_features = list(all_words.keys())[:12000]


def best_word_feats(words):
    return dict([(word, True) for word in words if word in word_features])

def best_bigram_features(words, score_fn=BigramAssocMeasures.chi_sq, n=250):
    bigram_finder = BigramCollocationFinder.from_words(words)
    bigrams = bigram_finder.nbest(score_fn, n)
    d = dict([(bigram, True) for bigram in bigrams])
    d.update(best_word_feats(words))

featuresets = [(best_bigram_features(rev), category) for (rev, category) in documents]

random.shuffle(featuresets)

training_set = featuresets[:2250]
testing_set = featuresets[2250:]

MNB_classifier = SklearnClassifier(MultinomialNB())
MNB_classifier.train(training_set)
print("MNB_classifier accuracy percent:", (nltk.classify.accuracy(MNB_classifier, testing_set))*100)

Но это дает мне ошибку, говоря:

feature_names.sort()
TypeError: '<' not supported between instances of 'str' and 'tuple'

Это в строке:

 MNB_classifier.train(training_set)

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

0 ответов

Другие вопросы по тегам