LINUX.ORG.RU

Как разбить текст на слова?

 


0

1

Всем привет! Не могу понять, как разбить текст на слова. То есть допустим на вход даётся строка «этопримертекста», а на выходе нужно получить список слов в виде массива [«это», «пример», «текста»] или в виде текста «это пример текста», неважно. Язык, на котором написаны слова, не важен. Язык программирования тоже неважен. Для упрощения можно использовать только топ-100 или топ-1000 самых популярных слов. Также нужно, чтобы сложность была не экспоненциальная, то есть надо использовать наверное какие-нибудь эвристики. Также нужна устойчивость к опечаткам, поэтому алгоритм бойера-мура не подойдёт. Также нужно это сделать без использования нейросетей

Перемещено Dimez из general

Что-то ничего лучше:

  1. Собираешь список всех возмжных разбиений.

  2. Для каждого случая считаешь расстояние Левенштейна для всех слов. (Понадобится хороший словарь, да).

  3. Выбираешь минимальное. Что такое «минимальное» — тоже интересный вопрос.

не придумывается. Чтобы совсем не умереть нужно придумать хорошее ограничение на количество пропущенных/лишних букв в слове.

ugoday ★★★★★
()
Ответ на: комментарий от TwoSpikes

и в итоге ты получишь алгоритм, неотличимый от свёрточной сети :)
т.е. точно такая же нейросетка, только все коэффициенты ты просчитываешь вручную, а это жопа по количеству работы.
но как опыт по разбору семантики будет большой.

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 1)
Ответ на: комментарий от ugoday

Нет смысла считать все возможные разбиения.

Ты себе представь, что ты взял «войну и мир» и вырвал оттуда одну случайную страницу и рассматриваешь её. Глубокий художественный замысел автора, быть может, и пройдёт мимо тебя, но даже на одной изолированной странице (минус два предложения оставшиеся без начала и без конца) есть вся необходимая информация для всего низкоуровневого - разбиения на слова, определения частей речи, грамматического разбора предложений и т д.

Так что надо брать окно на сколько то десятков символов и идти им. Строить все возможные разбиения в окне, выбирать самое вероятное (учитывать, что последнее слово, возможно, обрезано и надо его не учитывать) и брать оттуда первое слово. Затем сдвигать окно на конец этого слова и повторять алгоритм.

Потому что ну не будет такого, что у тебя простыня текста «Война и мир» и одна буква на последней странице меняет разбиение слов на первой. В текстах на естественном языке высокая локальность всех низкоуровневых эффектов, потому что иначе их было бы невозможно читать. В поле зрения попадает лишь несколько строк в каждый момент времени.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от KivApple

Так что надо брать окно на сколько то десятков символов и идти им.

Так это автоматически получится. Если в словаре нет слов длиннее 10 букв, то нет смысла рассматривать слова длинее 15 в качестве участника возможного разбиения.

ugoday ★★★★★
()

Держи: https://github.com/fxsjy/jieba/tree/master?tab=readme-ov-file#algorithm

Based on a prefix dictionary structure to achieve efficient word graph scanning. Build a directed acyclic graph (DAG) for all possible word combinations.

Use dynamic programming to find the most probable combination based on the word frequency.

For unknown words, a HMM-based model is used with the Viterbi algorithm.

Подходит по всем параметрам. В китайском не нужно думать о пробелах, поэтому оно изначально под твой формат ввода. Опечатки решаются традиционным для CJK-языков методом: «это проблема юзера, нужно смотреть когда вводишь». Hidden Markov model для слов не в словаре можно отключить.

x3al ★★★★★
()
Ответ на: комментарий от Psilocybe

В некоторых языках пишут справа налево.

Это как раз неважно — там же просто RTL юникодный будет стоять (и то не факт), а байтики, обозначающие буковки всё равно будут в том порядке идти, в котором читаются. Просто при отображении на экране пишется справа-налево, что для данной задачи не имеет значения.

CrX ★★★★★
()

Язык, на котором написаны слова, не важен Для упрощения можно использовать только топ нужно, чтобы сложность была не экспоненциальная

Если прям с такими упрощенными условиями, то я бы делал так: Сперва подставить все слова во все позиции, сложность пусть будет и квадратная, по условиям проходит Если где вдруг выпали конфликтующие варианты, задействовать динамическое программирование – при условии что в середине взято слово w остается левая и правая половина которые можно решать отдельно, итд. Для каждого интервала (a,b) будет одно оптимальное решение, всего таких интервалов не более чем квадрат, все в месте в полиномиальную сложность как-нибудь да уложится Еще нужна какая-то произвольная формула по которой определять какое решение оптимальнее. Например давать n^2 очков за каждое слово длины n и -1 за каждую букву которая никуда не вошла.

anonymous
()
Ответ на: комментарий от TwoSpikes

Просто я хотел сделать парсер человеческого языка без нейросетей.

Да ладно выдумывать! Ясно же, что ты решил создать собственный ИИ, с блэкдже…

seiken ★★★★★
()