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

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

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

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

  1. Если двойная кавычка находится в начале строки, угадайте, что это открывающая кавычка.
  2. Если в конце строки стоит двойная кавычка, угадать закрывающую кавычку.
  3. Если перед двойной кавычкой стоит пробел, угадывается открывающая кавычка.
  4. Если за двойной кавычкой следует пробел, угадайте закрывающую кавычку.
  5. Если двойные кавычки не вписываются ни в одну из вышеперечисленных категорий, предположите, что это «противоположность» последнему использовавшемуся виду двойных кавычек.

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

Есть еще идеи? Ничего страшного, если охвачены не все возможные случаи; цель состоит в том, чтобы быть как можно более умным, но не более того. :-)

Правка. Еще несколько моментов, о которых, возможно, стоит подумать (или которые могут не иметь значения, не уверен):

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

person ShreevatsaR    schedule 04.02.2009    source источник
comment
Я, наконец, сделал преобразование фактического документа. Первые четыре правила охватывают все двойные кавычки. Для одинарных кавычек сразу после запятой или точки обрабатывались многие закрывающие кавычки, а все остальное мне приходилось обрабатывать вручную.   -  person ShreevatsaR    schedule 09.06.2009


Ответы (9)


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

Это не так, в общем случае.

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

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

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

Однако на самом деле это только мой вкус, и обычно это не считается оправданным только потому, что символ определяется стандартом Unicode как АПОСТРОФ.

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

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

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

Конечно, лучше всего установить раскладку клавиатуры, которая может напрямую печатать умные кавычки. У меня есть ‘’ на AltGr+[], «» на AltGr+Shift+[], --— на AltGr+[Shift]+тире и так далее.

person bobince    schedule 04.02.2009
comment
Хорошие моменты! К сожалению, я уже на 3/4 закончил работу с этим файлом (переформатировал общедоступную книгу с OCR), и хотя я пытался внести некоторые изменения вручную, я продолжал замечать, что большинство из них можно было бы автоматизировать... и это привело к этот вопрос. :) - person ShreevatsaR; 04.02.2009
comment
О, был там! Да, я обычно делаю это с помощью простого метода, описанного выше, но оставляю апострофы такими, какие они есть, когда они внутри слова. По-прежнему требуется ручная проверка, чтобы обнаружить начальные апострофы и притяжательные формы множественного числа, которые были неправильно преобразованы. - person bobince; 04.02.2009

Хорошим местом для начала будет конечный автомат:

  • Начиная с позиции 0, перебирать символы
  • Найдя котировку, войти в состояние «Цитата» (открытая котировка)
  • Если в состоянии «Цитата» вы столкнулись с цитатой, вернитесь в состояние «Начало» (закрывающая цитата).

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

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

My $0.02

person Ryan Emerle    schedule 04.02.2009
comment
Это просто предполагает, что символы кавычек попеременно являются открывающими и закрывающими кавычками, что категорически неправильно. - person ShreevatsaR; 04.02.2009
comment
Вот где вступает в действие нормализация. Если вы знаете, что есть разрыв абзаца, вы можете изменить мошенническую цитату на что-то другое. Конечный автомат — это инструмент для обработки нормализованного текста. Как правило, найти все странные случаи проще, чем учесть все хорошие случаи. - person Ryan Emerle; 05.02.2009
comment
Чередование кавычек — это простой случай, и есть десятки способов справиться с этим, включая ваш. Я пытаюсь найти более широкий набор эвристик (больше, чем просто альтернативу), который обрабатывает как можно больше случаев. Эвристика в вопросе уже охватывает больше случаев, чем этот ответ (5). - person ShreevatsaR; 05.02.2009
comment
Дело в том, что в реализации можно использовать конечный автомат. Я выложил пример, но более сложный конечный автомат легко справится с 99% случаев. Это должно быть открытое обсуждение сложностей английского языка или подходов к решению вашей проблемы? - person Ryan Emerle; 05.02.2009
comment
Фактическая механика (сохранение состояния, откат, написание парсера рекурсивного спуска и т. д.) — это детали реализации, и я думаю, что справлюсь с ними. Вопрос действительно касается идей высокого уровня, основанных на английском языке... извините, если это было неясно. Как я мог сформулировать это лучше? - person ShreevatsaR; 06.02.2009
comment
Извините, я неправильно понял. Я думаю, вы отлично справились с описанием своей проблемы, это просто контекст сайта, который заставил меня пойти по пути реализации. - person Ryan Emerle; 06.02.2009

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

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

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

person Community    schedule 04.02.2009

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

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

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

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

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

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

Другой, может быть, менее сложной идеей может быть:

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

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

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

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

person Georg Schölly    schedule 04.02.2009

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

person Mark Ransom    schedule 04.02.2009
comment
Да, я упоминал об этом в вопросе выше. Как можно изучить, что делает Word? :) - person ShreevatsaR; 04.02.2009
comment
Получите последнюю версию Word и поэкспериментируйте с различными условиями. Вы уже создали хороший список исключительных случаев, и я уверен, что со временем вы создадите еще больше. - person Mark Ransom; 04.02.2009
comment
Чтобы быть более конкретным — сгенерируйте гипотезу алгоритма, который они используют, и придумайте тестовые примеры, которые опровергли бы эту гипотезу. Если вы потерпите неудачу, вы, вероятно, правильно угадали алгоритм. - person Mark Ransom; 04.02.2009

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

/([^\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-страничную книгу примерно за секунду. Я думаю, что было бы трудно сопоставить его скорость процедурно.

person dkretz    schedule 04.02.2009

Кто-нибудь занимается компьютерной лингвистикой?

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

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

person Bluu    schedule 04.02.2009
comment
... и если вы хотите двигаться в этом направлении, en.wikipedia.org/wiki/Natural_Language_Toolkit — хорошее место, чтобы узнать об этом и найти инструменты для его реализации. (Учебное пособие одновременно по обработке естественного языка и Python.) - person dkretz; 04.02.2009

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

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

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

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

В Википедии есть немного информации об этих надоедливых вещах.

person Louis    schedule 04.02.2009

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

person James Heffer    schedule 11.10.2017
comment
Извините, это не ответ на вопрос, и это не то, что я спрашивал. У меня нет проблем со вставкой символов или или или ; вопрос заключался в том, чтобы придумать алгоритм/эвристику/набор правил для когда вставлять какой символ. - person ShreevatsaR; 11.10.2017