Обновить
15
0
Юрий@frazer

Программист

Отправить сообщение
В 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

Тест:
[["Люди","любят","г.","Волгоград",",","имеющий","историю",",","уходящую","в","века","."]]

Результат:
Люди любят г. Волгоград, имеющий историю, уходящую в века.

Второй вариант
echo 'Люди любят рис. Нью дели имеет историю, уходящую в века' | ./bin/alm -alphabet "abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя" -method tokens

Тест:
Люди любят рис. Нью дели имеет историю, уходящую в века

Результат:
[
    [
        "Люди",
        "любят",
        "рис",
        "."
    ],[
        "Нью",
        "дели",
        "имеет",
        "историю",
        ",",
        "уходящую",
        "в",
        "века"
    ]
]

echo '[["Люди","любят","рис","."],["Нью","дели","имеет","историю",",","уходящую","в","века"]]' | ./bin/alm -alphabet "abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя" -method tokens

Тест:
[["Люди","любят","рис","."],["Нью","дели","имеет","историю",",","уходящую","в","века"]]

Результат:
Люди любят рис.
Нью дели имеет историю, уходящую в века

Третий вариант
echo 'Наш сайт выпивка.рф объявляет набор гостей. Ваш адрес: выпивка.рф/1,2 человека уже зашли, будь третьим! (Напоминаю: выпивка.рф/1)' | ./bin/alm -alphabet "abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя" -method tokens

Тест:
Наш сайт выпивка.рф объявляет набор гостей. Ваш адрес: выпивка.рф/1,2 человека уже зашли, будь третьим! (Напоминаю: выпивка.рф/1)

Результат:
[
    [
        "Наш",
        "сайт",
        "выпивка.рф",
        "объявляет",
        "набор",
        "гостей",
        "."
    ],[
        "Ваш",
        "адрес",
        ":",
        "выпивка.рф/1,2",
        "человека",
        "уже",
        "зашли",
        ",",
        "будь",
        "третьим",
        "!"
    ],[
        "(",
        "Напоминаю",
        ":",
        "выпивка.рф/1",
        ")"
    ]
]

echo '[["Наш","сайт","выпивка.рф","объявляет","набор","гостей","."],["Ваш","адрес",":","выпивка.рф/1,2","человека","уже","зашли",",","будь","третьим","!"],["(","Напоминаю",":","выпивка.рф/1",")"]]' | ./bin/alm -alphabet "abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя" -method tokens

Тест:
[["Наш","сайт","выпивка.рф","объявляет","набор","гостей","."],["Ваш","адрес",":","выпивка.рф/1,2","человека","уже","зашли",",","будь","третьим","!"],["(","Напоминаю",":","выпивка.рф/1",")"]]

Результат:
Наш сайт выпивка.рф объявляет набор гостей.
Ваш адрес: выпивка.рф/1,2 человека уже зашли, будь третьим!
(Напоминаю: выпивка.рф/1)


Как видим, все тесты отработали правильно.
Я понимаю о чем вы говорите и от части даже согласен, но выходит, что мы играем в угадайку тыкая пальцем в небо. Вы предполагаете, что будет ошибка и преподносите это как истину, при этом ничего не проверяя. Да, какие-то недочеты будут, угадать все, везде и вся невозможно. Если вернуться к контексту то 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

image
Тест:
На рис. 1 изображена ваза, см. наш каталог. Заходи к нам на сайт https://example.com/1,2,3#сноска-1 за более подробной информацией

Результат:
[
    [
        "На",
        "рис.",
        "1",
        "изображена",
        "ваза",
        ",",
        "см.",
        "наш",
        "каталог",
        "."
    ],[
        "Заходи",
        "к",
        "нам",
        "на",
        "сайт",
        "https://example.com/1,2,3#сноска-1",
        "за",
        "более",
        "подробной",
        "информацией"
    ]
]

$ echo '[["На","рис.","1","изображена","ваза",",","см.","наш","каталог","."],["Заходи","к","нам","на","сайт","https://example.com/1,2,3#сноска-1","за","более","подробной","информацией"]]' | ./bin/alm -alphabet "abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя" -method tokens

image
[["На","рис.","1","изображена","ваза",",","см.","наш","каталог","."],["Заходи","к","нам","на","сайт","https://example.com/1,2,3#сноска-1","за","более","подробной","информацией"]]

Результат:
На рис. 1 изображена ваза, см. наш каталог.
Заходи к нам на сайт https://example.com/1,2,3#сноска-1 за более подробной информацией


P.S. ALM тоже загружает данные с диска через mmap.

Спасибо за критику, буду благодарен за тестирование. Согласитесь, что догадки хорошо а конкретные результаты намного лучше.
Насчёт препроцессинга на питоне, здесь основная идея в токенизаторе, если он плохой, то и собственно обрабатывать нечего. Токенизатор даже в KenLM, работает исключительно по пробелам а значит с неподготовленным за ранее текстом он работать будет плохо. Именно для решения этой задачи и задумывалась библиотека.
1. Про KenLM, я так и написал, что она поддерживает русский язык и utf-8. Но она же наверное и самая требовательная к качеству текста, например если размер N-граммы выше 3.

2. Свои токены можно устанавливать любого размера без ограничения.

3. Интерфейса для вызова на питоне пока нет, но это в планах. Те скрипты на питоне, их интерпретацией занимается ALM, запуская внутри себя.

4. Поддержка pip будет сразу, как будет готов мост для питона.
Я тоже так думаю
Да, я много способов разных пробовал по обновлению, этот более удобный оказался и все под машину компилируется, в идеале конфиг ядра почистить надо чтобы вообще ничего лишнего небыло.
Вы считаете что зря раскрыл?
А Вы внимательно читали статью? Или просто посмотрели что много всего написано?

Все обновление системы занимает буквально пару строчек, все подробное описание здесь это компиляция ядра и настройка самой системы.

И другие варианты все выше описанные я проверял и тот что описал единственно рабочий оказался, нет желания убеждать в обратном и что-то доказывать, если считаете, что другие методы лучше то значит пусть так и будет.

Тем же кому статья оказалась полезна, если что-то не понятно то спрашивайте я объясню
2

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Дата рождения
Зарегистрирован
Активность