Классификатор NLTK для целочисленных функций?Python

Программы на Python
Ответить
Anonymous
 Классификатор NLTK для целочисленных функций?

Сообщение Anonymous »

В моем векторе признаков есть объекты целочисленного типа, которые NaiveBayesClassifier NLTK обрабатывает как номинальные значения.
Контекст
Я пытаюсь построить языковой классификатор с использованием n-грамм. Например, биграмма «th» чаще встречается в английском языке, чем во французском.
Для каждого предложения в моем обучающем наборе я извлекаю признак следующим образом: биграмма(th): 5, где 5 (пример) представляет собой количество раз, когда биграмма «th» появлялась в предложении.
Однако я понял, что классификатор не распознает, что такие признаки являются линейными. Например, он может считать bigram(ea): 4 французским, bigram(ea): 5 английским и bigram(ea): 6 снова французским. Это совершенно произвольно и не отражает логику того, что биграмма более распространена ни в английском, ни в французском языке.
Дополнительные мысли
Конечно, я мог бы заменить эти функции такими функциями, как has(th): True. Однако я считаю, что это плохая идея, поскольку французское предложение с одним экземпляром «th» и английское предложение с пятью экземплярами «th» будут иметь функцию has(th): True.
Я также нашел это соответствующее обсуждение, но оно не дало мне ответа.
Экстрактор функций
Мой экстрактор функций выглядит следующим образом:
def get_ngrams(word, n):
ngrams_list = []
ngrams_list.append(list(ngrams(word, n, pad_left=True, pad_right=True, left_pad_symbol='_', right_pad_symbol='_')))
ngrams_flat_tuples = [ngram for ngram_list in ngrams_list for ngram in ngram_list]
format_string = ''
for i in range(0, n):
format_string += ('%s')
ngrams_list_flat = [format_string % ngram_tuple for ngram_tuple in ngrams_flat_tuples]
return ngrams_list_flat

# Feature extractor
def get_ngram_features(sentence_tokens):
features = {}
# Unigrams
for word in sentence_tokens:
ngrams = get_ngrams(word, 1)
for ngram in ngrams:
features[f'char({ngram})'] = features.get(f'char({ngram})', 0) + 1
# Bigrams
for word in sentence_tokens:
ngrams = get_ngrams(word, 2)
for ngram in ngrams:
features[f'bigram({ngram})'] = features.get(f'bigram({ngram})', 0) + 1
# Trigrams
for word in sentence_tokens:
ngrams = get_ngrams(word, 3)
for ngram in ngrams:
features[f'trigram({ngram})'] = features.get(f'trigram({ngram})', 0) + 1
# Quadrigrams
for word in sentence_tokens:
ngrams = get_ngrams(word, 4)
for ngram in ngrams:
features[f'quadrigram({ngram})'] = features.get(f'quadrigram({ngram})', 0) + 1
return features

Пример извлечения признаков
get_ngram_features(['test', 'sentence'])

Возвраты:
{'char(c)': 1,
'char(e)': 4,
'char(n)': 2,
'char(s)': 2,
'char(t)': 3,
'bigram(_s)': 1,
'bigram(_t)': 1,
'bigram(ce)': 1,
'bigram(e_)': 1,
'bigram(en)': 2,
'bigram(es)': 1,
'bigram(nc)': 1,
'bigram(nt)': 1,
'bigram(se)': 1,
'bigram(st)': 1,
'bigram(t_)': 1,
'bigram(te)': 2,
'quadrigram(_sen)': 1,
'quadrigram(_tes)': 1,
'quadrigram(ence)': 1,
'quadrigram(ente)': 1,
'quadrigram(est_)': 1,
'quadrigram(nce_)': 1,
'quadrigram(nten)': 1,
'quadrigram(sent)': 1,
'quadrigram(tenc)': 1,
'quadrigram(test)': 1,
'trigram(_se)': 1,
'trigram(_te)': 1,
'trigram(ce_)': 1,
'trigram(enc)': 1,
'trigram(ent)': 1,
'trigram(est)': 1,
'trigram(nce)': 1,
'trigram(nte)': 1,
'trigram(sen)': 1,
'trigram(st_)': 1,
'trigram(ten)': 1,
'trigram(tes)': 1}


Подробнее здесь: https://stackoverflow.com/questions/496 ... r-features
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»