Я использую официальную библиотеку Python FastText (v0.9.2) для классификации намерений.
import fasttext
model = fasttext.train_supervised(input='./test.txt',
loss='softmax',
dim=200,
bucket=2000000,
epoch=25,
lr=1.0)
Где test.txt содержит только один пример файла, например:
__label__greetings hi
и предсказать два высказывания результаты:
print(model.words)
print('hi', model.predict('hi'))
print('bye', model.predict('bye'))
app_1 | ['hi']
app_1 | hi (('__label__greetings',), array([1.00001001]))
app_1 | bye ((), array([], dtype=float64))
Это мой ожидаемый результат, между тем, если установить два образца для одной и той же метки:
__label__greetings hi
__label__greetings hello
Результат для OOV неверный.
app_1 | ['hi', '</s>', 'hello']
app_1 | hi (('__label__greetings',), array([1.00001001]))
app_1 | bye (('__label__greetings',), array([1.00001001]))
Я так понимаю, что проблема с токеном </s>
, может быть \n
в текстовом файле?, а когда в словаре нет ни слова, текст заменяется на </s>
. Есть ли какой-нибудь вариант поезда или способ пропустить такое поведение?
Спасибо!
FastText — это большой, требовательный к данным алгоритм, который начинается со случайной инициализации. Вы не должны ожидать, что результаты будут разумными или действительно будут соответствовать какому-либо набору ожиданий для наборов данных игрушечного размера, где (например) 100%-минус-эпсилон ваших n-граммовых ведер не получат никакого обучения.
Я также не ожидал бы, что режим supervised
когда-либо надежно предскажет отсутствие меток на реалистичных наборах данных — он ожидает, что все его обучающие данные будут иметь метки, и я не видел упоминания о его использовании для предсказания подразумеваемой «призрачной» категории «нет в обучающих данных» по сравнению с одной известной меткой (как в «классификации одного класса»).
(Георетически, я думаю, вам, возможно, придется передать режиму FastText supervised
явно __label__not-greetings
помеченные контрастные данные — возможно, просто синтезированные случайные строки, если у вас нет ничего другого — для того, чтобы у него была хоть какая-то надежда на осмысленное предсказание «не-приветствий».)
Учитывая это, я бы не считал ваш первый результат для ввода bye
правильным, а второй результат неправильным. И то, и другое — просто результат шума из-за того, что недообученную модель просят сделать какое-то различие, которое она, как известно, не может сделать.
В дополнение к ответу gojomo мы можем сказать, что ваш набор данных для обучения слишком мал.
Если у вас нет значительного аннотированного набора данных, вы можете попробовать классификацию с нулевым выстрелом: начиная с предварительно обученной языковой модели, вы устанавливаете только некоторые метки и позволяете модели пытаться классифицировать предложения.
Здесь можно посмотреть и протестировать интересную демку.
Читайте также эту хорошую статью о классификации нулевого выстрела, с теорией и реализацией.
спасибо за ваш ответ, я понимаю вашу точку зрения, в конце концов, fasttext - это еще одна модель классификатора текста, мое замешательство было в том, что я использовал реализацию nodejs (binding) и работал так, как я показал, после того, как я прочитал ваш комментарий, я проверяю саму реализацию и до предсказание, которое он проверяет, есть ли токены в словаре. Еще раз спасибо за разъяснения.