Подтвердить что ты не робот

Идеи для преобразования прямых котировок в фигурные кавычки

У меня есть файл, который содержит "прямые" (обычные, ASCII) кавычки, и я пытаюсь преобразовать их в реальный глифы цитат ( "кудрявые" котировки, U + 2018 до U + 201D). Так как преобразование из двух разных символов кавычек в один из них было потеряно в первую очередь, очевидно, что нет никакого способа автоматически выполнить это преобразование; тем не менее, я подозреваю, что несколько эвристик будут охватывать большинство случаев. Таким образом, план - это script (в Emacs), который выполняет примерно следующее: для каждого символа прямой кавычки

  • Угадайте, какой фигурный символ цитаты использовать, если возможно
  • попросите пользователя (меня) подтвердить или сделать выбор

Этот вопрос касается первого шага: какой будет хороший алгоритм (набор эвристик, более похожий) для обычного текста на английском языке (например, роман)? Вот некоторые предварительные идеи, которые, я считаю, работают для двойных кавычек (встречные примеры приветствуются!):

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

Одиночные кавычки сложнее, потому что ' может быть либо вводной цитатой, закрывающей цитатой, либо апострофом, и мы хотим оставить только апострофы (не должны писать "mustnt" ). Некоторые из тех же правил, что и выше, применяются, но "возможные апострофы находятся в начале слов (или линий)", хотя они менее распространены, чем "два в прошлом". Я не могу охарактеризовать правила, которые должным образом обрабатывали бы такие фрагменты, как [ "Мне нравится", что шоу 70-х годов ", - сказала она]. Это может потребовать просмотра не только соседних символов, но и вычисления расстояний между кавычками, например...

Больше идей? Это нормально, если не все возможные случаи охвачены; цель должна быть настолько умной, насколько это возможно, но не дальше.: -)

Изменить. Еще несколько вещей, о которых стоит подумать (или может быть неактуальным, не уверены):

  • цитаты могут не всегда совпадать с парами. Для одинарных кавычек это очевидно, как описано выше. Но даже для двойных кавычек, когда есть цитата, которая распространяется более чем на один абзац, обычная типографская конвенция (не спрашивайте меня почему) заключается в том, чтобы начинать каждый абзац с кавычки, даже если она не была закрыта в предыдущем один. Таким образом, просто сохранение машины состояний, которая чередуется между двумя состояниями, не будет работать!
  • Вложенная цитата (упоминается в примере "Мне нравится", который показан выше "): это может привести к тому, что любая из цитат не будет предшествовать пробелу или следовать пробелу.
  • Британский/американский стиль пунктуации: запятые внутри кавычек или снаружи?
  • Многие текстовые процессоры (например, Microsoft Word) уже выполняют какое-то преобразование, подобное этому. Хотя они не идеальны и часто могут быть раздражающими, может быть поучительно узнать, как они работают...
4b9b3361

Ответ 1

угадать, какой фигурный символ цитаты использовать, если возможно

В общем случае это не так.

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

мы хотим оставить только апострофы

Я согласен! Но не так много людей. Это обычная практика набора текста, чтобы превратить апостроф в одиночную цитату слева. Лично я предпочитаю оставлять их такими, какие они есть, чтобы отличать их от включения кавычек, облегчая чтение текста (я нахожу) и возможность автоматической обработки.

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

'Возможные апострофы находятся в начале слов

Действительно. Невозможно рассказать апостроф из потенциальной открытой цитаты в таких случаях, как классические фишки Fish 'n' Chips, за исключением огромного культурного контекста.

(Не говоря уже о простых числах, окинах, гортанных стопах и различных других применениях апострофа...)

Лучше всего сделать, конечно, установку раскладки клавиатуры, которая может напрямую набирать смарт-цитаты. У меня есть "на AltGr + []", "на AltGr + Shift + [], - на AltGr + [Shift] + тире и т.д.

Ответ 2

Хорошее место для запуска будет с конечного автомата:

  • Начиная с позиции 0, итерации по символам
  • После нахождения цитаты введите состояние "Котировки" (открытая цитата)
  • Если в состоянии "Котировки" и вы встретите цитату, вернитесь в состояние "Запуск" (закрывающая цитата)

Вы можете принимать дополнительные решения при каждом переходе состояния.

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

Мои $0,02

Ответ 3

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

Для примера апострофа ( "Мне нравится", что шоу 70-х годов ", - сказала она), маловероятно, что кавычки будут вложены непосредственно внутри кавычек того же типа. Вы могли бы воспользоваться этим.

Лучший способ сделать это, на мой взгляд, - заставить код обрабатывать недвусмысленные случаи (двойные кавычки довольно просты). Для тех, у кого есть несколько возможных вариантов, сохраните свою позицию в списке и изучите ее, когда она закончится. Вы можете найти несколько более легко закодированных случаев там, или вы можете просто решить их исправить вручную.

Ответ 4

  • Основная задача - всегда искать совпадающие пары. Учитывая, что у каждой цитаты есть соответствующая цитата, вы можете заставить свою программу запрашивать вашу помощь только там, где она не знает, какая совпадающая цитата.

  • Кавычки открытия всегда находятся на открытии линии или имеют место перед ними. Закрытие котировок всегда занимает место после них. Если вы найдете двоеточие со следующей цитатой, это, вероятно, закрывающая цитата.

  • Если буква, следующая за цитатой, является верхним регистром, это, вероятно, открывающая цитата.

  • Если перед цитатой есть знак препинания, это, вероятно, закрывающая цитата.

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

  • Во втором раунде что-то вроде всех цитат, которые он не знает, открывают ли они кавычки или апострофы. Для всех открывающих котировок он должен автоматически найти заключительную цитату.

Другая, возможно, менее сложная идея может быть:

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

  • Все остальные кавычки должны быть легко конвертированы. Открывающие кавычки имеют перед ними пробелы или новую линию и закрываются после них.

Одна последняя мысль:

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

Ответ 5

Я ненавижу это говорить, но лучшим способом действий может быть изучение того, что делает Word, и скопировать его. Даже если это неправильно в некоторых случаях, оно представляет собой стандарт, к которому привыкли многие люди. Одно поведение для эмулирования - это отмена (Ctrl-Z), сразу же возвращающаяся к прямой цитате после того, как вы заменили кривую.

Ответ 6

Вот регулярное выражение, которое может помочь для двойных кавычек:

/([^\s\(]?)"(\s*)([^\\]*?(\\.[^\\]*)*)(\s*)("|\n\n)([^\s\)\.\,;]?)/gms

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

Numbered element    identification  
  1               non-white-space before quote quote  
  2               white-space after leading quote  
  5               white-space before trailing quote  
  6               trailing quote (or double-newline, i.e. start of a paragraph  
  7               character after trailing quote if not whitespace or right   paren                     

Я думаю, было бы разумно продлить это для ваших других случаев (мне просто не нужно было этого делать.)

Это синтаксис javascript. Это довольно быстро, но я не сделал больше оптимизма, чем мой "достаточно хороший". Он сделает примерно 400 страниц за несколько секунд. Я думаю, что было бы сложно сопоставить его скорость процедурно.

Ответ 7

Вычислительная лингвистика кто?

Кто-то упомянул, если бы у вас был огромный культурный контекст, это было бы возможно. Таким образом, избыточное, но наиболее точное автоматическое решение проблемы - мелкий анализ. Для этого требуется свод любого языка и способа, с которыми вы имеете дело (например, корпус Brown для общего английского).

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

Ответ 8

[ "Мне нравится" Это шоу 70-х годов ", сказала она]

Я изначально думал, что, возможно, использование нескольких проходов над текстом, чтобы получить представление контекста, может помочь, но это не решит все экземпляры.

Лучшее, что вы могли бы сделать, это запустить список возможных наборов слов/выражений типа "twas", "tis", "70" и т.д. и бросить их в словаре с автоматической коррекцией на них, чтобы преобразовать прямые в завитки и наоборот. Проверка орфографии выполняется на каждом слове, не так ли? (извините, что не помогает вашей проблеме emacs)

OO игнорирует единственную цитату, изогнутую все вместе, из того, что я могу сказать.

Wikipedia содержит немного информации об этих неприятных вещах.

Ответ 9

Попробуйте Shift + Ctrl + "(клавиша двойной цитаты), это сработало для меня в Windows 10 с помощью программы Kalipso.