代码之家  ›  专栏  ›  技术社区  ›  ShreevatsaR

将直引号转换为弯引号的想法

  •  12
  • ShreevatsaR  · 技术社区  · 17 年前

    我有一个包含“直”(普通,ASCII)引号的文件,我正在尝试将它们转换为真实的 quotation mark glyphs (_156;curly_157;quotes,U+2018 to U+201D)。由于从两个不同的引号字符转换为一个单引号字符的过程一开始就有损失,显然无法自动执行此转换;不过,我怀疑一些启发式方法会覆盖大多数情况。所以这个计划是一个脚本(在emacs中),它执行如下操作:对于每个直引号字符,

    1. 如果可能,猜猜要使用哪一个花引号字符
    2. 请用户(我)确认或做出选择

    这个问题是关于第一步的:对于普通的英语文本(例如小说),使用什么样的算法(更像是一套启发式算法)?以下是一些初步的想法,我相信这对双引号有效( 欢迎反例! ):

    1. 如果双引号位于行首,则猜测它是开首引号。
    2. 如果双引号位于行尾,则猜测右引号。
    3. 如果双引号前面有空格,则猜测一个左引号。
    4. 如果双引号后跟空格,则猜测右引号。
    5. 如果双引号不符合上述类别之一,则猜测它是最近使用的双引号中的对。

    单引号比较复杂,因为 ' 可能是开场白,结束白, 撇号,我们希望撇开撇号(不能写mustn t)。上面的一些规则也适用,但是撇号可能出现在单词(或行)的开头,尽管它比过去的两个单词(twa)不太常见。她说:“我不能随便想一想规则来正确处理像这样的片段。”它可能需要查看不止一个相邻字符,并计算引号之间的距离,例如_

    还有什么想法吗?如果不是所有可能的案例都被涵盖,这是可以的;目标是尽可能的智能化,但不能再深入。-)

    编辑 :还有一些值得思考的事情(或者可能不相关,不确定):

    • 引号可能不总是成对的 :对于单引号来说,很明显的原因如上所述。但即使是双引号,当有一个引文扩展到多个段落时,通常的排版惯例(不要问我为什么)是以引号开始每个段落,即使它在前一个段落中没有关闭。所以 简单地保持一个在两个状态之间交替的状态机 工作!
    • 嵌套引用(在上面的“I like”中提到的“70s show”示例):这可能会产生任何一种引用 前面或后面有空格。
    • 英式/美式标点符号样式:引号内还是引号外有逗号?
    • 许多文字处理器(如Microsoft Word)已经进行了类似这样的转换。虽然它们并不完美,而且常常令人讨厌,但是学习它们是如何工作的可能是有指导意义的。
    9 回复  |  直到 8 年前
        1
  •  2
  •   bobince    17 年前

    如果可能,猜猜要使用哪一个花引号字符

    一般情况下,情况并非如此。

    大多数自动转换器使用的简单算法只是查看在“或”之前键入的前一个字母。如果是空格、行首、左括号或其他左引号,请选择左引号,否则选择右引号。这个方法的优点是它可以按您的类型运行,所以当它选择了错误的方法时,您通常可以纠正它。

    我们只想撇开撇号

    我同意!但很少有人这样做。将撇号转换为左引号是正常的排字习惯。就我个人而言,我更喜欢保持原样,将它们与随附的引号区分开来,使文本更容易阅读(我找到),并且可以自动处理。

    然而,这真的只是我的口味,一般认为这是不合理的,仅仅是因为该字符是由Unicode标准定义为单引号。

    可能是单词开头有撇号

    的确。在经典的鱼片“n”这样缺少大量文化背景的案例中,无法从潜在的公开引用中辨别撇号。

    (更不用说素数、冲绳、发音停止和撇号的各种其他用法…)

    当然,最好的办法是安装一个键盘布局,可以直接输入智能引号。我在altgr+[]上有___,在altgr+shift+[]上有___,在altgr+[shift]+破折号上有___,等等。

        2
  •  3
  •   Ryan Emerle    17 年前

    最好从状态机开始:

    • 从位置0开始,循环访问字符
    • 找到报价后,输入“报价”状态(未清报价)
    • 如果处于“报价”状态,并且遇到报价,则返回“开始”状态(结束报价)

    您可以在每个状态转换时做出其他决定。

    例如,您可以尝试通过识别已知的连词来规范化单引号,并在处理之前将它们转换为不同的(而不是文本)字符。

    我的0.02美元

        3
  •  2
  •   user42092    17 年前

    看起来你最初的帖子涵盖了我在这里写的大部分想法,这就是我剩下的……

    对于撇号示例(“我喜欢‘70年代的节目’”,她说),引号不太可能直接嵌套在同一类型的引号中。你可以利用这个机会。

    在我看来,最好的方法是让代码只处理明确的情况(双引号非常简单)。对于有多个可能选择的人,将他们的位置存储在一个列表中,并在完成后检查它。您可能会在其中找到一些更容易编码的案例,或者您可能只是决定手动修复它们。

        4
  •  1
  •   Georg Schölly Crazy Developer    17 年前
    1. 最基本的事情是总是试图找到匹配的对。考虑到每个报价都有一个匹配的报价,您可以让您的程序只在不确定哪个是匹配的报价时请求您的帮助。

    2. 开首引号总是在行首或有空格 在前面 他们当中。右引号总是空格 之后 他们。如果您找到一个冒号,它可能是一个右引号。

    3. 如果报价后面的字母是大写,则可能是开场价。

    4. 如果在引文前面有标点符号,可能是右引号。

    5. 试着反复做。程序应该首先询问您它可以明确分配给函数的所有引号。(只是为了确保它没有出错。)

    6. 在第二轮中,类似于所有的引号,它们不确定是打开引号还是撇号。对于所有的开盘价,它必须自动查找开盘价。

    另一个可能不那么复杂的想法可能是:

    1. 查找全部 非引文 通过向用户询问可能是报价或非报价的每个报价。

    2. 剩下的所有报价都应该很容易转换。开首引号前面有空格或换行符,后面有结束符。

    最后一个想法:

    你应该像只处理段落那样把过程分开。如果你的程序出错了,这可能会给语言带来复杂性,你更容易纠正它,程序可以从新的段落开始。

        5
  •  1
  •   Mark Ransom    17 年前

    我不想这么说,但最好的做法可能是研究单词的作用,然后复制它。即使在某些情况下这是错误的,它也代表了许多人已经习惯的标准。要模拟的一个行为是让撤消(ctrl-z)在替换弯引号后立即还原为直引号。

        6
  •  1
  •   dkretz    17 年前

    下面是一个可能有助于双引号的正则表达式:

    /([^\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
  •  1
  •   Bluu    17 年前

    Computational linguistics 有人吗?

    有人提到,如果你有大量的文化背景,这可能是可行的。所以对这个问题的过度杀伤力但最准确的自动化解决方案是 shallow parsing . 这需要一个语料库,不管你使用什么语言和模式(例如 the Brown corpus 一般英语)。

    根据语料库中出现的花引号的句法上下文,开发花引号的分类器。最后,给分类器一个带有直引号的任意语法上下文,弹出最可能的引号字符!

        8
  •  0
  •   lsl    17 年前

    她说:“我喜欢‘70年代的演出’。”

    我最初认为,也许通过对文本进行多次传递来获得上下文洞察力可能会有所帮助,但这并不能解决所有的实例。

    你能做的最好的事情就是列出一系列可能的词组/表达式,比如“twas”、“tis”、“70”等,然后将它们放入字典中,并对它们进行自动更正,以将笔直转换为卷曲,反之亦然。不管怎样,每个单词都会进行拼写检查,对吗?(抱歉,这对您的Emacs问题没有帮助)

    从我所能看出的情况来看,oo忽略了所有弯曲的单引号。

    Wikipedia 有一些关于这些烦人的事情的信息。

        9
  •  0
  •   James Heffer    8 年前

    尝试shift+ctrl+“(双引号键),这对我在Windows10上很有用,使用一个名为kalispo的程序。

    推荐文章