Вы действительно можете обойтись без сегментации слов !?
В предыдущем посте я представил четыре способа токенизации китайских документов:
Третий и четвертый способы используют SentencePiece от Google. Я упомянул, что SentencePiece достаточно эффективна, поэтому нам не нужно заранее выполнять сегментацию слов (предварительную токенизацию).
Я еще не пробовал использовать SentencePiece без предварительной токенизации. Постараюсь сделать это в следующем цикле разработки.
Наконец я нашел время поэкспериментировать. И это небольшой пост, в котором представлены результаты.
Можно ли пропустить сегментацию слов?
Судя по моим экспериментам, это действительно так (т.е. мы можем пропустить сегментацию слов). Фактически, модель, в которой слова не сегментировались, работала лучше, чем та, которая делала это.
(Используемый набор данных - это набор данных обзора фильмов, который я собрал, как описано в этом посте - [Предварительный просмотр] Разработка современных китайских моделей НЛП ». На этот раз я расширил набор данных, чтобы он стал примерно в три раза больше, и немного изменил целевую переменную. Задача состоит в том, чтобы предсказать рейтинг пользователя по комментарию, используя регрессионную модель.)
Пример
Это предложение, взятое из реального обзора:
唯一的看点大概就是阿汤哥怎么折磨自己了
Если мы сделаем сегментацию слов перед применением SentencePiece, результат будет примерно таким:
唯一 的 看点 大概 就是 阿汤哥 怎么 折磨 自己 了
Тогда модель SentencePiece разметила бы вышеуказанный результат как:
‘▁唯一’, ‘▁的’, ‘▁看’, ‘点’, ‘▁大概’, ‘▁就是’, ‘▁阿汤哥’, ‘▁怎么’, ‘▁折磨’, ‘▁自己’, ‘▁了’
Инструмент словесной сегментации сделал большую часть работы. Единственное, что SetencePiece сделала иначе, так это разделила 看点 на «» и «点».
Теперь, если мы применим другую модель SentencePiece, которая была обучена без сегментации слов перед этим, к исходному предложению. Результатом стали:
'▁', '唯一的', '看点', '大概', '就是', '阿汤哥', '怎么', '折磨', '自己', '了'
Мы видим, что эта модель SentencePiece научилась сегментировать слова сама по себе с удивительно хорошей точностью. Это объясняет, почему окончательные оценки MSE в таблице 1 очень близки.
Предостережение: размер словарного запаса
Модель с сегментацией слов действительно получила меньше (лучше) недоумение. Однако трудности, связанные с этими двумя моделями, нельзя напрямую сравнивать из-за различий в словарях.
Представьте, что у нас есть язык, состоящий всего из четырех символов, и у нас есть это предложение:
abcdabcbcd
Предположим, что мы можем разделить предложение на:
abc dab cbcd
Если мы скармливаем приведенное выше сегментированное предложение для обучения модели SentencePiece, модель могла бы создать два уникальных токена _d, _c, которые никогда не появятся, если мы скармливаем модели необработанное предложение. .
Исходя из приведенной выше логики, нам может потребоваться увеличить размер словарного запаса, когда мы применяем сегментацию слов перед SentencePiece.
Бонус
SentencePiece также опубликовала здесь некоторые результаты экспериментов, которые они провели в отношении предварительной токенизации:
Как видите, в некоторых случаях предварительная токенизация все еще может быть полезна. Поэтому нам не следует полностью игнорировать сегментацию, когда мы пытаемся справиться с новыми проблемами.
Исходный код
Код, использованный для экспериментов:
Проверьте сценарии в scripts/sentiment_analysis
и scripts/language_model
, чтобы узнать, где искать.
Приносим извинения за отсутствие документации в этом репо. Кодовая база сейчас проходит капитальный ремонт. Постараюсь превратить его в более документированный и модульный.
Плавник
Спасибо за прочтение! Пожалуйста, подумайте о том, чтобы дать этому посту несколько аплодисментов, если вы сочтете его полезным.