В python библиотека будет доступна уже в эти выходные. Можно использовать токенизатор отдельно от языковой модели. Я все же не согласен с тем, что токенизатор не нужен языковой модели, в моём понимании языковая модель сильно зависит от токенизатора. Во всяком случае я предусмотрел возможности его отключения и в ситуациях когда он не нужен, можно работать также как допустим с KenLM или SriLM.
На русский язык упор был сделан потому, что в нашем мире принято его в лучшем случае учитывать как данность нежели полноценно его поддерживать. Но хочу заметить, жестко ничего не вшито в библиотеку, что относится к русскому языку и мешает другим языкам. В равной степени поддерживаются все европейские языки.
Хочу заметить, что очевидно перед данным решением стояла не только задача токенизации, а более объемная задача статистической языковой модели. Жаль это осталось без рассмотрения.
Большое спасибо за фидбек по кодовой базе — я обязательно учту некоторые моменты.
Но, к сожалению, не только семантика делает понимание исходников сложным, но и требования по уровню экспертизы читающего. Данное решение по умолчанию не простое ввиду необходимой специфики для решения задач. Специалистов с хорошей экспертизой в инженерии по данной теме, а не использовании подобных решений, очень мало.
Классы символов не захардкожены. В статье описано какие символы к каким токенам относятся.
Есть механизм переопределения и отключения токенов.
выпивка.рф/1,2 — отработал правильно, такой формат URI разрешен спецификацией.
В данном варианте не каждый человек поймёт, а мысли пока приложения читать не умеют.
>> А так — правила для русского языка вроде бы вы неплохие сделали, можно будет попробовать их использовать.
Все европейские языки, с азиатскими конечно будут проблемы. Поддержка токенизатором языка, ограничивается только алфавитом ну и передаваемым списком аббревиатур.
>> К тексту из социальных сетей ваш токенайзер ещё рано подпускать, там с расположением пробелов проблемы, да и с большими буквами тоже. Туда — только нейросети.
Чтобы обучить нейросеть, нужна разметка и эмбеддинг.
И повторюсь, статья не о токенизаторе а о языковой модели, токенизатор это небольшой функционал библиотеки.
Если для работы вы используете KenLM, то в ALM все те же самые подходы также будут работать.
Токенизатор не ограничивает функционал и никто вам, не мешает чистить текст перед обучением своими скриптами.
P.S. Я не думаю, что код в SriLM или KenLM проще или что есть много желающих его дописать.
Проверил предложенные вами варианты, самому стало интересно и вот результат.
Первый вариант
echo 'Люди любят г. Волгоград, имеющий историю, уходящую в века.' | ./bin/alm -alphabet "abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя" -method tokens
Тест:
Люди любят г. Волгоград, имеющий историю, уходящую в века.
Люди любят г. Волгоград, имеющий историю, уходящую в века.
Второй вариант
echo 'Люди любят рис. Нью дели имеет историю, уходящую в века' | ./bin/alm -alphabet "abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя" -method tokens
Тест:
Люди любят рис. Нью дели имеет историю, уходящую в века
Я понимаю о чем вы говорите и от части даже согласен, но выходит, что мы играем в угадайку тыкая пальцем в небо. Вы предполагаете, что будет ошибка и преподносите это как истину, при этом ничего не проверяя. Да, какие-то недочеты будут, угадать все, везде и вся невозможно. Если вернуться к контексту то KenLM не умеет даже этого. А ALM не ограничивает разработчика в использовании стороннего препроцессинга.
avl33, ведь это — просто токенизатор, неоднозначности в таком виде он снимать не умеет.
Предложенный вами вариант будет интерпретирован как аббревиатура.
Токенизатор это только часть функционала библиотеки, основной функционал это — языковая модель.
Неоднозначности такого рода можно снимать только после обучения языковой модели, когда контекст будет собран. На этапе сборки, контекст ещё неизвестен.
После сборки языковой модели, по уже известному контексту — можно снимать неоднозначности. Такой функционал на половину реализован, сам токенизатор предстоит еще доработать, для работы с обученной языковой моделью.
По поводу: «имеет верный контекст с точки зрения собранной языковой модели.»
Если собирать языковую модель обычным токенизатором который работает по пробелам, любые знаки препинания будут ломать N-граммы.
Текст:
Если поставить simple.c в конец, то получается, что использование символа ...
Собранные N-граммы длины 3:
Если поставить simple.c
поставить simple.c в
simple.c в конец,
в конец, то
конец, то получается,
то получается, что
получается, что использование
что использование символа
Из этого мы имеем сломанные N-граммы от которых пользы ноль
simple.c в конец,
в конец, то
конец, то получается,
то получается, что
получается, что использование
Конечно, большинство людей скажут, мол за ранее удаляем все знаки препинания и задача решена. Но нет, в этом случае мы получаем также сломанные N-граммы выбитые из контекста. Другие скажут, берём n-граммы между знаками препинаний, но тогда мы сильно теряем в контексте получая мало информации. Куда правильнее знаки препинания учитывать также отдельными N-граммами, да неоднозначности будут, да они всегда будут и не важно какое приложение работает с текстом, будь нейросетевые решения или решения основанные на алгоритмах и шаблонах.
Токенизатор ALM соберет эти N-граммы таким образом:
Если поставить simple.c
поставить simple.c в
simple.c в конец
в конец <punct>
конец <punct> то
<punct> то получается
то получается <punct>
получается <punct> что
<punct> что использование
что использование символа
Таким образом мы не теряем контекст и учитываем его более правильно. Для большинства вариантов текстов, этого достаточно. Бывает, что знаки препинания очень важны и их следует разделять, учитывать как отдельные N-граммы, чтобы точка была — точкой а запятая — запятой. Для этого — предусмотрен механизм с помощью скриптов python, переопределять N-граммы по своему. Собственно это и есть подконтрольный токенизатор. В данном случае, каждая новая N-грамма будет передана в скрипт и разработчик по своему мнению может её обработать.
buriy, по вашим замечаниям я проверил токенизатор.
$ echo 'На рис. 1 изображена ваза, см. наш каталог. Заходи к нам на сайт https://example.com/1,2,3#сноска-1 за более подробной информацией' | ./bin/alm -alphabet "abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя" -method tokens
Тест:
На рис. 1 изображена ваза, см. наш каталог. Заходи к нам на сайт https://example.com/1,2,3#сноска-1 за более подробной информацией
Насчёт препроцессинга на питоне, здесь основная идея в токенизаторе, если он плохой, то и собственно обрабатывать нечего. Токенизатор даже в KenLM, работает исключительно по пробелам а значит с неподготовленным за ранее текстом он работать будет плохо. Именно для решения этой задачи и задумывалась библиотека.
1. Про KenLM, я так и написал, что она поддерживает русский язык и utf-8. Но она же наверное и самая требовательная к качеству текста, например если размер N-граммы выше 3.
2. Свои токены можно устанавливать любого размера без ограничения.
3. Интерфейса для вызова на питоне пока нет, но это в планах. Те скрипты на питоне, их интерпретацией занимается ALM, запуская внутри себя.
4. Поддержка pip будет сразу, как будет готов мост для питона.
Да, я много способов разных пробовал по обновлению, этот более удобный оказался и все под машину компилируется, в идеале конфиг ядра почистить надо чтобы вообще ничего лишнего небыло.
А Вы внимательно читали статью? Или просто посмотрели что много всего написано?
Все обновление системы занимает буквально пару строчек, все подробное описание здесь это компиляция ядра и настройка самой системы.
И другие варианты все выше описанные я проверял и тот что описал единственно рабочий оказался, нет желания убеждать в обратном и что-то доказывать, если считаете, что другие методы лучше то значит пусть так и будет.
Тем же кому статья оказалась полезна, если что-то не понятно то спрашивайте я объясню
На русский язык упор был сделан потому, что в нашем мире принято его в лучшем случае учитывать как данность нежели полноценно его поддерживать. Но хочу заметить, жестко ничего не вшито в библиотеку, что относится к русскому языку и мешает другим языкам. В равной степени поддерживаются все европейские языки.
Большое спасибо за фидбек по кодовой базе — я обязательно учту некоторые моменты.
Но, к сожалению, не только семантика делает понимание исходников сложным, но и требования по уровню экспертизы читающего. Данное решение по умолчанию не простое ввиду необходимой специфики для решения задач. Специалистов с хорошей экспертизой в инженерии по данной теме, а не использовании подобных решений, очень мало.
Классы символов не захардкожены. В статье описано какие символы к каким токенам относятся.
Есть механизм переопределения и отключения токенов.
выпивка.рф/1,2 — отработал правильно, такой формат URI разрешен спецификацией.
В данном варианте не каждый человек поймёт, а мысли пока приложения читать не умеют.
>> А так — правила для русского языка вроде бы вы неплохие сделали, можно будет попробовать их использовать.
Все европейские языки, с азиатскими конечно будут проблемы. Поддержка токенизатором языка, ограничивается только алфавитом ну и передаваемым списком аббревиатур.
>> К тексту из социальных сетей ваш токенайзер ещё рано подпускать, там с расположением пробелов проблемы, да и с большими буквами тоже. Туда — только нейросети.
Чтобы обучить нейросеть, нужна разметка и эмбеддинг.
И повторюсь, статья не о токенизаторе а о языковой модели, токенизатор это небольшой функционал библиотеки.
Если для работы вы используете KenLM, то в ALM все те же самые подходы также будут работать.
Токенизатор не ограничивает функционал и никто вам, не мешает чистить текст перед обучением своими скриптами.
P.S. Я не думаю, что код в SriLM или KenLM проще или что есть много желающих его дописать.
Первый вариант
Тест:
Результат:
Тест:
Результат:
Второй вариант
Тест:
Результат:
Тест:
Результат:
Третий вариант
Тест:
Результат:
Тест:
Результат:
Как видим, все тесты отработали правильно.
Предложенный вами вариант будет интерпретирован как аббревиатура.
Токенизатор это только часть функционала библиотеки, основной функционал это — языковая модель.
Неоднозначности такого рода можно снимать только после обучения языковой модели, когда контекст будет собран. На этапе сборки, контекст ещё неизвестен.
После сборки языковой модели, по уже известному контексту — можно снимать неоднозначности. Такой функционал на половину реализован, сам токенизатор предстоит еще доработать, для работы с обученной языковой моделью.
По поводу: «имеет верный контекст с точки зрения собранной языковой модели.»
Если собирать языковую модель обычным токенизатором который работает по пробелам, любые знаки препинания будут ломать N-граммы.
Текст:
Собранные N-граммы длины 3:
Из этого мы имеем сломанные N-граммы от которых пользы ноль
Конечно, большинство людей скажут, мол за ранее удаляем все знаки препинания и задача решена. Но нет, в этом случае мы получаем также сломанные N-граммы выбитые из контекста. Другие скажут, берём n-граммы между знаками препинаний, но тогда мы сильно теряем в контексте получая мало информации. Куда правильнее знаки препинания учитывать также отдельными N-граммами, да неоднозначности будут, да они всегда будут и не важно какое приложение работает с текстом, будь нейросетевые решения или решения основанные на алгоритмах и шаблонах.
Токенизатор ALM соберет эти N-граммы таким образом:
Таким образом мы не теряем контекст и учитываем его более правильно. Для большинства вариантов текстов, этого достаточно. Бывает, что знаки препинания очень важны и их следует разделять, учитывать как отдельные N-граммы, чтобы точка была — точкой а запятая — запятой. Для этого — предусмотрен механизм с помощью скриптов python, переопределять N-граммы по своему. Собственно это и есть подконтрольный токенизатор. В данном случае, каждая новая N-грамма будет передана в скрипт и разработчик по своему мнению может её обработать.
Тест:
Результат:
Результат:
P.S. ALM тоже загружает данные с диска через mmap.
2. Свои токены можно устанавливать любого размера без ограничения.
3. Интерфейса для вызова на питоне пока нет, но это в планах. Те скрипты на питоне, их интерпретацией занимается ALM, запуская внутри себя.
4. Поддержка pip будет сразу, как будет готов мост для питона.
Все обновление системы занимает буквально пару строчек, все подробное описание здесь это компиляция ядра и настройка самой системы.
И другие варианты все выше описанные я проверял и тот что описал единственно рабочий оказался, нет желания убеждать в обратном и что-то доказывать, если считаете, что другие методы лучше то значит пусть так и будет.
Тем же кому статья оказалась полезна, если что-то не понятно то спрашивайте я объясню