如何打开包装文字?

时间:2013-08-06 03:36:32

标签: algorithm

我的系统收到一个字符串消息。发件人在收到之前应用自动换行。假设发送系统的自动换行算法的每行最大字符数是已知的,是否可以正确解包文本,同时保留有意义的(用户插入的)换行符?

例如,这里有一些文字。在示例中,我们将让*表示有意义的用户插入换行符,而¬表示换行算法(系统)插入换行符。

输入

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed in elit¬
vitae rutrum. Mauris in fringilla nulla, id rutrum augue.*
Sed non venenatis diam. Nam porta diam eget ante tincidunt ornare. Nulla¬
iaculis auctor. Pellentesque nec diam id quam gravida sollicitudin. Donec¬
dictum libero vitae.*
*
Venenatis eleifend vestibulum ante ipsum primis in faucibus orci luctus et*
*
Ultrices posuere cubilia Curae; Quisque vitae tempus odio.

最终我要做的是"展开"保留用户插入的文本,有意义的换行符。

预期输出

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed in elit vitae rutrum. Mauris in fringilla nulla, id rutrum augue.*
Sed non venenatis diam. Nam porta diam eget ante tincidunt ornare. Nulla iaculis auctor. Pellentesque nec diam id quam gravida sollicitudin. Donec dictum libero vitae.*
*
Venenatis eleifend vestibulum ante ipsum primis in faucibus orci luctus et*
*
Ultrices posuere cubilia Curae; Quisque vitae tempus odio.

正如您所看到的,解包算法的任务是首先将每个换行符分类为有意义或插入系统。通过检查当前行的字符数加上下一行的第一个字的字符数,我能够非常接近。然而,这并不完美,因为它会将以Venenatis开头的句子中的换行符分类为系统插入:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed in elit vitae rutrum. Mauris in fringilla nulla, id rutrum augue.*
Sed non venenatis diam. Nam porta diam eget ante tincidunt ornare. Nulla iaculis auctor. Pellentesque nec diam id quam gravida sollicitudin. Donec dictum libero vitae.*
*
Venenatis eleifend vestibulum ante ipsum primis in faucibus orci luctus et*
Ultrices posuere cubilia Curae; Quisque vitae tempus odio.

感谢任何见解,皮特

3 个答案:

答案 0 :(得分:2)

我不认为当自动换行和硬回线换行符编码相同时,可以可靠地解决一般问题。你可以做一个近似值:

  • 在强制自动换行之前发生的换行(即,下一个单词适合该行)肯定是一个难以理解的。 (这包括将空行计算为硬中断。)
  • 否则,如果该行以段落终止符结束,那么它更可能是一个难以理解的。

第二个条件的棘手部分是计算谓词“似乎是段落终止符”。最低要求是以句末标点符号序列(“。”,“!”,“。”等)结束。附加要求可能是候选人难以分割平衡的标点符号对(括号,成对引号等)。 (推论,至少在英语中,是一个序列:

  

开引语,文本,句子终止符,公开引用,文本

几乎肯定是一个艰难的突破。)

这一切显然都是针对特定语言的。它还假设文本本身没有拼写错误(不平衡的引号等)。

即使这样,你也可能会得到一些误报。但是,我认为没有任何简单的方法可以改进它。

答案 1 :(得分:1)

如果一个文件没有换行符,只需要模式" x x x x x ..."一旦系统插入换行符以产生带有换行符的输出,则在系统中运行它。如果我将该输出视为新输入并再次通过系统运行它将不需要添加任何新的换行符,输出将与输入相同。

所以我有两个不同的输入(有和没有换行符)映射到相同的输出。因此,没有绝对正确的方法来确定哪个输入是自动换行以产生任何给定的输出,因为多个输入可以映射到相同的输出。

为了更进一步,我认为你需要一些关于用户输入文件真实外观的描述,这样你就可以拒绝用户实际上恰好放入所有必要的换行符的理论,因此系统从不实际上需要添加任何换行符。

答案 2 :(得分:0)

我做了类似这样的事情,作为OCR的一本书。很容易识别隐含预期换行符的短线。棘手的部分是捕获一个段落的最后一行在故意换行之前一直运行到边缘的情况。我最终得到了启发式方法,帮助我确定下一行可能是新段落的开头。在小说中,这包括诸如以引号或大写字母开头的内容。这不完美,我不得不阅读并纠正错误。在发现问题和完善规则之前,我没有走得太远。从长远来看,它确实节省了我的时间,但它远非自动化。