如何定义一条河流的恶劣程度?

如何定义一条河流的恶劣程度?

我写了一个算法来尝试检测段落中的河流当我运行它时,它实际上检测到了相当多的内容。其中一些显然是误报,但也有一些确实是连续行上的对齐空格。以下是一些,在下图中用绿色标记:

河流的集合

什么时候河流真的有问题和/或丑陋?这个例子中的河流是否值得修复?

哪些参数(及其重要性)可以衡量一条河流的“糟糕程度”,以及如何计算这些参数?

另外想问一下,似乎没有河流的标准定义。正确定义河流肯定有助于定义导致河流恶化的参数。您如何定义河流?

答案1

在阅读了 lockstep 和 Lev 的回答后,我得出了自己的看法。我认为有四个主要因素导致河流变坏:

  1. 其定位:更直,情况愈糟;
  2. 其宽度:越大,越差;
  3. 其宽度的恒定性:越恒定,越差;
  4. 长度:越长,越糟糕。

由此,我想我可以尝试通过检查以下内容来改进算法:

  1. 在尽可能多的行上(而不是仅仅 3 行)找到重叠的空格(我已经这样做了);
  2. 尝试通过线性回归来近似河流并检索回归因子;
  3. 测量每个节点的宽度,并计算平均值 μ 和标准差 σ。
  4. 根据所有这些,根据以下内容计算不良程度:
    • 回归因子(越接近直线,越糟糕),可能是某种微分方程
    • 平均宽度μ除以标准空间宽度ω (与标准字间距相比,越大越差),
    • 宽度的标准差σ(越小,越糟糕)
    • 长度(行数n,时间越长,越糟糕)。

坏处可能类似于(有一个因素α使其正常化):

建议配方

在哪里

alpha=10000 瓦

将最大不良程度设置为 10000。

我建议σ微分方程因为它们似乎比μn

利用此公式,我们可以得到:

  • 当 b 趋向于 10000 时μ趋向于无穷大(对于非常大的空间来说,最大坏处);
  • 当 b 趋向于 10000 时n趋向于无穷大(许多线路的最大不良程度);
  • 当 b 趋向于 0 时μ趋向于 0(较小的空间可减少不良程度);
  • 当 b 趋向于 0 时n趋向于 0(较少的线会降低不良程度);
  • 当 b 趋向于 10000 时σ趋向于 0(等宽文本会增加不良程度);
  • 当 MSE 趋向于 0 时,b 趋向于 10000(完美对齐的空间肯定非常糟糕);
  • 当 b 趋向于 0 时σ趋向于无穷大(不同的空间趋向于减少坏处);
  • 当 MSE 趋向于无穷大时,b 趋向于 0(未对齐的空间不会导致真正的河流)。

我对河流的定义是:

一系列意外的对齐空间恒定宽度3 个或以上连续的行

编辑:正如 Bruno 所说,αω因为我们无论如何都将最大不良程度固定为 10000,所以在计算中实际上并不使用。此外,算法可以通过不计算来简化μ自从是所有宽度的总和:

在此处输入图片描述

和:

在此处输入图片描述

编辑2:S+ σ + MSE我实际上正在考虑在分母中使用类似的东西,而不是S * (σ * MSE)^2。 这样做的原因是:

  • 什么时候σ为零(完全相同的空间),这并不意味着河流一定是坏的,它仍然取决于 MSE(对齐);
  • 当 MSE 为零(完美对齐的空间)时,并不一定意味着河流不好,它仍然取决于空间的大小;
  • 我不确定正方形是否有必要σ和 MSE(但必须通过实验来证明),因为它们已经是平方差了。

作为一个小进度记录,这里是 Lev 转换为 LuaTeX + fontspec 的优秀示例:

\documentclass{article}
\usepackage{fontspec}
\setmainfont[Ligatures=TeX]{Minion Pro}
\usepackage{microtype}
\usepackage[draft,rivers]{impnattypo}
\begin{document}
\noindent\parbox{8.5cm}{\hspace{15pt}
eget niis non lobero at conseyquat lacus. Vestibulum eg
Lorem ipsum dolor sit amew jonsectetun ad PL Wilson elit
Pellentesque nec turpis nisv Ac lobortis ballacus.  Ut fringil
nis, non ipsum gravida sep `doltrices' odio dictub.  Tam id l
fermintum dolor. Pail NT cabitant morbi istiqleith  vibendi
senectus et netus erepaw dalesuada fames ic turpak  wegest
Nam ac nunc vel nique.  aliquam dictum etat magna.  Thats
risus neque. `Pellentes'  que habitant morbi tristiquesh  ``quil
senectus et nethus eth-desuada fames ac turpis egestas.}
\end{document}

并遇到了我当前的算法:

检测错误

它检测到了不少东西......除了两条大河,它们实际上并没有在三条连续的线上重叠......还有很多工作要做......

至于重叠问题,我认为行间距越大,空间之间的间距就越大。如果行间距非常近,空间必须重叠才能形成河流,但如果行间距非常松散,那么水平方向实际上相距较远的空间也可以形成对角河流。

更新:我考虑到河流低于 45°(有垂直线),在这种情况下,重叠可以取线高 + 或 - 。因此,新算法认为空间不一定必须严格垂直重叠,但重叠可以是两条线之间的距离 + 或 - 。Lev 的示例的结果是这样的:

允许 + 或 - 行高重叠

下一步将分析超过 3 行代码(我仍然在做),并定义和应用河流劣化来消除假阳性河流。这似乎有点困难,因为我必须在 Lua 中定义一个列表对象来链接河流的节点,但我正在慢慢实现这一点。

答案2

我认为要想正确做到这一点,您确实需要考虑字形的形状。有些字形,例如.,-'非常轻。其他字形,例如ATVWvwLkbhdpq“向左”或“向右倾斜”。我认为如果不考虑字形形状,就无法发现此示例中的两条河流:

在此处输入图片描述

编辑:为了回应 Raphink 的评论,下面是同样的例子,但带有\usepackage{microtype}。我认为它看起来并没有好很多(我也不指望它会好很多,因为这种效果不依赖于边距突出或字体扩展):

在此处输入图片描述

正如我在这个答案如果我使用 MinionPro 制作相同的示例,其空间要窄得多,那么它看起来确实没那么令人反感,但仍然很糟糕:

在此处输入图片描述

我认为寻找河流的最佳方法是将段落栅格化,然后对生成的位图进行某种图像处理。

这是基于 MinionPro 的示例的源代码(在进行过程中我没有保存其他内容):

\documentclass{article}
\usepackage{MinionPro}
\usepackage{microtype}
\begin{document}
\noindent\parbox{8.2cm}{\hspace{15pt}
eget niis non lobero at conseyquat lacus. Vestibulum eg
Lorem ipsum dolor sit amew jonsectetun ad PL Wilson elit
Pellentesque nec turpis nisv Ac lobortis ballacus.  Ut fringil
nis, non ipsum gravida sep `doltrices' odio dictub.  Tam id l
fermintum dolor. Pail NT cabitant morbi istiqleith  vibendi
senectus et netus erepaw dalesuada fames ic turpak  wegest
Nam ac nunc vel nique.  aliquam dictum etat magna.  Thats
risus neque. `Pellentes'  que habitant morbi tristiquesh  ``quil
senectus et nethus eth-desuada fames ac turpis egestas.}
\end{document} 

编辑2

以下是一个类似的例子,将“倾斜”的字母替换为不倾斜的字母。将上一段替换为:

\noindent\parbox{8.2cm}{\hspace{15pt}
eget niis non lobero at conseyquat lacus. Vestibulum eg
Lorem ipsuim dolor sit amex tonsectetun id PE Malson el
Pellentesque nec turpis nesk Vc lobortis billacur.  Dt fringi
nis, non ipsum gravida seq `boltrices' odio dictud.  Eam id l
fermintum dolor. Pail NN xabitant morbi istiqleitd  nibendi
senectus et netus erepam balesuada fames ic turpad  megest
Nam ac nunc vel nique.  fliquam dictum etat magna.  Khats
risus neque. `Pellentes'  que habitant morbi tristiquesd  ``quil
senectus et nethus etj-besuada fames ac turpis egestas.}

为了获得以下非河流(或至少不那么具有攻击性):

在此处输入图片描述

答案3

我建议根据以下定义/公式为河流分配“不良程度”值:

  • 当两个或多个连续的文本行具有水平重叠的空白时,就会出现河流。(Raphink 的检测算法似乎遵循此定义。)

  • 河流的“恶劣程度”可以计算为

    (overlap / word space ) * (no. of text lines)^2 * 250
    

根据这个公式,宽度为正常单词空间 50% 的三行河流将被分配一个 1125 的不良值,这大约是“挑剔”用户应该开始担心的水平。具有相同重叠但延伸到五行文本的河流将具有 3125 的不良值,即“非常成问题”。 (我只是编造了这些参数来提出一些讨论。)

编辑:在您的示例中,我认为根据我建议的公式,最左边的河流(非常小,但延伸到四条线)将被分配最高坏度。我预测坏度值约为 1500 到 2000,也就是说,只有在修复不会破坏其他内容(例如,导致hboxes 不完整或大量连字符)的情况下才值得修复。

答案4

我怀疑这是否实用,但以防万一……但问题要简单得多(概念上(不是计算上的),并且更接近于眼睛所做的,如果检测是在页面图像上进行的 - 在像素空间而不是字符空间中。那么它“只”需要稍微模糊一下图像,然后搜索稍微垂直且比阈值更浅的长线。可能需要最小宽度,但如果幸运的话,适当的模糊将使它变得不必要。

相关内容