Формат текста с учетом пунктуации - PullRequest
2 голосов
/ 16 мая 2011

Как мне отформатировать текст на естественном языке с учетом пунктуации? Встроенная команда Vim gq или инструменты командной строки, такие как fmt или par , переводят строки без знаков пунктуации. Позвольте мне привести вам пример,

fmt -w 40 дает не то, что я хочу:

we had everything before us, we had
nothing before us, we were all going
direct to Heaven, we were all going
direct the other way

smart_formatter -w 40 даст:

we had everything before us,
we had nothing before us,
we were all going direct to Heaven,
we were all going direct the other way

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

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

1 Ответ

0 голосов
/ 07 июля 2011

Вот не очень элегантный, но рабочий метод, который я наконец-то придумал. Предположим, разрыв строки в знаке препинания стоит 6 символов. Это означает, что я приму результат, который является более неровным, но содержит больше строк, оканчивающихся знаком препинания, если длина "неровности" меньше 6 символов. Например, это нормально («рваность» - 3 символа).

Wait!
He said.

Это не нормально («шероховатость» более 6 символов)

Wait!
He said to them.

Метод заключается в добавлении 6 фиктивных символов после каждого знака пунктуации, форматировании текста и удалении фиктивных символов.

Вот код для этого

sed -e 's/\([.?!,]\)/\1 _ _ _/g' | fmt -w 34 | sed -e 's/ _//g' -e 's/_ //g'

Я использовал _ (пробел + подчеркивание) в качестве пары фиктивных символов, предполагая, что они не содержатся в тексте. Результат выглядит неплохо,

we had everything before us,
we had nothing before us,
we were all going direct to
Heaven, we were all going
direct the other way
...