Идеи для преобразования прямых цитат в фигурные цитаты - PullRequest
13 голосов
/ 04 февраля 2009

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

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

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

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

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

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

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

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

Ответы [ 9 ]

3 голосов
/ 04 февраля 2009

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

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

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

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

Мои $ 0,02

2 голосов
/ 04 февраля 2009

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

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

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

2 голосов
/ 04 февраля 2009

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

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

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

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

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

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

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

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

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

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

1 голос
/ 04 февраля 2009

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

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

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

1 голос
/ 04 февраля 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 страниц книги примерно за секунду. Я думаю, что было бы трудно согласовать его скорость с процедурной точки зрения.

1 голос
/ 04 февраля 2009

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

1 голос
/ 04 февраля 2009
  1. Основная задача - всегда пытаться найти подходящие пары. Учитывая, что в каждой цитате есть соответствующая цитата, вы можете заставить свою программу обращаться за помощью только в том случае, если не уверены, какая из этих цитат совпадает.

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

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

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

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

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

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

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

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

Последняя мысль:

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

0 голосов
/ 11 октября 2017

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

0 голосов
/ 04 февраля 2009

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

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

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

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

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

...