LINUX.ORG.RU

diff и merge или как сложить несколько изменений?

 


0

2

или я не знаю что это, но что-то должно быть

например у меня есть текст:

qwe wer ert rty

из него через replace получается 3 строки:

1. qwe <wer> ert rty

2. qwe <wer ert> rty

3. qwe wer <ert rty>

т.е. у меня есть список «что»-«на что», я его накладываю на тест, получаю 3 элемента в списке.

и вот из этих трех я хочу получить строку:

qwe <wer> <wer ert> <ert rty>

т.е. все эти преобразования сложить.

если я делаю diff, получаю дельту и патчу, то оно мне все портит и оставляет последний элемент, грубо говоря. или diff нужен какой-то похитрее. какой?

я могу положить все это к какую-то структуру, но тогда вопрос в какую и как из нее получить обратно текст? как сохранить порядок элементов? при это первое слово, qwe, вообще пока ни в какую структуру не влезет, оно просто ни к чему не относится, а значит потеряется?

если я делаю text = text.replace() то второй replace уже не сработает <wer> не попадет под правило. т.е. понятно что у меня плавила неправильные и их надо менять, но у меня нет способа узнать которое из них не работает и собственно какое правило какое перекрывает, поэтому хочется больше визуализации.

Больше похоже на то, что надо идти по токенам входной строки и смотреть не совпадают ли последние N с одним из правил и, если совпадает, то выводить то, что оно производит. Т.е.

| - позиция ввода/вывода
-> подходящее правило
=> текущий вывод
а первая строка это ввод


| qwe wer ert rty
=> |

qwe | wer ert rty
=> qwe |

qwe wer | ert rty
-> <wer>
=> qwe <wer> |

qwe wer ert | rty
-> <wer ert>
=> qwe <wer> <wer ert> |

qwe wer ert rty |
-> <ert rty>
=> qwe <wer> <wer ert> <ert rty> |

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

хм...

сейчас я иду грубо говоря от обратного.

у меня match-ер, есть rules.map(rule -> match(rule, text) ? text.replace (rule))

при этом правило, оно регэксп, оно может хотеть одно слово, может хотеть 3.

ты предлагаешь сделать text.split («\\s») и фором пройтись по нему, проверяя, не сработает ли какой-то match-ер?

т.е. вот эти стрелочки --- это прикольно, на картинки типа https://github.com/tensorflow/models/raw/master/syntaxnet/looping-parser.gif я насмотрелся, но у меня нифига не складывается как это сделать и на выходе фигня какая-то :)

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

ты предлагаешь сделать text.split («\\s») и фором пройтись по нему, проверяя, не сработает ли какой-то match-ер?

Если бы не регулярки, то было бы проще (заранее известно количество слов и как далеко смотреть назад). А с ними надо пробовать возможные суффиксы (возможно, в каком-то определённом порядке, от меньших к большим, например).

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

вот это я не распарсил, суффиксы --- это что?

Это хвосты всех возможных длин. Тут при строке qwe wer ert rty длиной в 4 слова будет 4 суффикса (считая, что пустой нам не интересен):

1.             rty
2.         ert rty
3.     wer ert rty
4. qwe wer ert rty

Только тут же обрабатываются все префиксы, так что в итоге это будет проверка суффиксов каждого префикса исходной строки. Будет медленно, если строки не короткие.

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 1)

Чем-то напоминает darcs-ову алгебру патчей.

Прогоняешь все свои регекспы по одному, сохраняешь по каждому информацию типа «начало=3,конец=3,текст=<», потом все склеиваешь, сдвигая координаты последующих изменений на прирост текста слева от предыдущих. Нужно придумать правила склеивания этих объектов, которые не ломают данные. Не думаю, что это возможно в общем случае: что, например, делать, если 2 замены вставляют разные символы в одно место, или как определить, насколько нужно сдвинуть «второе» изменение, пересекающееся с первым по координатам, если текст внутри меняется? Но в каких-то специальных случаях получаться.

DonkeyHot ★★★★★
()
Ответ на: Чем-то напоминает darcs-ову алгебру патчей. от DonkeyHot

xaizek, я разбавил костылями, добавил в правило «плечи», типа если поматчилось то хорошо, но брать часть, определенную отдельно. и текст для следующего правила не ломается.

но смержить набор таких вот последовательных изменений все равно хочется, перекрытие правил не отменилось :(

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

А на каких примерах не работает? Может там сложные регулярные выражения и надо что-то дополнительно учитывать. Может будет проще изменить подход на подобным тому, что выше предлагают: исходную строку обрабатывать всему правилами по очереди, собирая информацию о совпадении (какой диапазон на что заменяется с каком-то учётом порядка правил/диапазонов), а потом посмотреть по каждому слову/символу и решить оставляем/заменяем/вставляем что-то до/вставляем что-то после.

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

А на каких примерах не работает?

«улицы чернышевского, ленина и кирова» vs «улицы чернышевского, ленина, кирова и иванова рядом стояла»

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

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

Это уже какой-то NLP, я в него не умею. Тут просто информации не хватит для принятия правильного решения без определения частей речи, так как неоднозначность по синтаксису не различима. Может какая-нибудь библиотека для NLP поможет.

xaizek ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.