我正在尝试识别文本中的引文。我可以使用LEX来定义和匹配引文模式。但是,这仅在引用正确时才有效。文档中往往存在很多细微的错误。
这些变化通常不是拼写错误。最常见的错误是缺少标点符号或引用元素。
问题:是否有一些有效的表驱动方法来进行近距离匹配? LEX的可能变化?或者可能是LEX编程技术(如YACC中的错误)。
答案 0 :(得分:1)
恢复这个问题,因为我看不到有人回答你。
使用通常的正则表达式引擎:否
正如您可能已经发现的那样,对于大多数引擎而言,正则表达式并不是进行近距离匹配或任意单词或短语的最佳工具。当然,在最基本的层面上,\bs?he\b
之类的内容会找到he
或she
...但要查找interactive
等单词中的所有近似匹配项,您和#39; d必须生成一个正则表达式,在单词中引入了许多排列......既无效又无效。
一个例外
我所知道的一个例外是Matthew Burnett的Python [regex][1]
模块。首先,它是一个了不起的引擎,是我所知道的(使用.NET)仅支持无限宽度外观的两个引擎之一。 (JGSoft也支持它,但它与语言无关。)
此引擎具有fuzzymatch
模式,可能只是执行您想要的操作。您可以提供成本等式" (最大替换数量等)。
您必须将Python连接到您的数据......可能有一个可用的模块。
这是文档的摘录。
正则表达式通常会尝试精确匹配,但有时候是近似的, 或者"模糊",对于那些文本存在的情况,需要匹配 搜索可能包含插入,删除或删除形式的错误 替换字符。
模糊正则表达式指定允许哪些类型的错误,以及 可选地,最小值和最大值或仅最大值 允许的每种类型的数量。 (您不能仅指定最小值。)
3种类型的错误是:
插入,由" i"表示删除,由" d"表示代换, 由" s"
表示此外," e"表示任何类型的错误。
正则表达式项目的模糊性在" {"和"}"后 该项目。
示例:
foo match" foo"准确
(?:foo){i}匹配" foo",允许插入
(?:foo){d}匹配" foo",允许删除
(?:foo){s}匹配" foo",允许替换
(?:foo){i,s}匹配" foo",允许插入和替换
(?:foo){e}匹配" foo",允许错误
如果指定了某种类型的错误,则表示未指定的任何类型 不允许。
在以下示例中,我将省略该项目并仅写入 模糊性。
{i <= 3}允许最多3次插入,但没有其他类型
{d <= 3}允许最多3次删除,但没有其他类型
{s <= 3}允许最多3次替换,但没有其他类型
{i <= 1,s <= 2}允许最多1次插入和至多2次替换, 但没有删除
{e <= 3}允许最多3个错误
{1&lt; = e&lt; = 3}允许至少1和最多3个错误
{i <= 2,d <= 2,e <= 3}允许最多2次插入,最多2次删除, 最多3个错误,但没有替换
还可以说明每种错误的成本和 允许的最高总费用。
示例:
{2i + 2d + 1s <= 4}每个插入成本2,每个删除成本为2 替代成本1,总成本不得超过4
{i <= 1,d <= 1,s <= 1,2i + 2d + 1s <= 4}最多1次插入,最多1次删除, 最多1次替换;每次插入费用2,每次删除费用2, 每次替换费用1,总费用不得超过4
你也可以使用&#34;&lt;&#34;而不是&#34;&lt; =&#34;如果你想要一个独家最低限度 或者最多:
{e <= 3}允许最多3个错误
{e <4}允许少于4个错误
{0
默认情况下,模糊匹配搜索符合的第一个匹配项 给定约束。 ENHANCEMATCH标志将导致它尝试 改善匹配的拟合(即减少错误的数量) 它找到了。
BESTMATCH标志将使其搜索最佳匹配。
需要注意的其他例子:
regex.search(&#34;(dog){e}&#34;,&#34; cat and dog&#34;)1返回&#34; cat&#34;因为那个 火柴&#34;狗&#34;有3个错误,这是在限制内(无限制 允许的错误数量。)
regex.search(&#34;(dog){e&lt; = 1}&#34;,&#34; cat and dog&#34;)1返回&#34;狗&#34; (用 领先的空间),因为那匹配&#34;狗&#34;有1个错误,这是 在限制范围内(允许1个错误)。
regex.search(&#34;(?e)(dog){e&lt; = 1}&#34;,&#34; cat and dog&#34;)1返回&#34;狗&#34; (没有前导空格)因为模糊搜索匹配&#34;狗&#34;同 1个错误,在限制范围内(允许1个错误),以及 (?e)然后尝试更好地适应。
在前两个例子中,后面有完美的匹配 字符串,但在任何情况下都不是第一个可能的匹配。
匹配对象有一个属性fuzzy_counts,它给出了总数 替换,插入和删除的数量。
A&#39; raw&#39;模糊匹配: regex.fullmatch(r&#34;(?:cats | cat){e&lt; = 1}&#34;,&#34; cat&#34;)。fuzzy_counts(0,0,1) 0次置换,0次插入,1次删除。
如果使用ENHANCEMATCH标志,则可能更好地匹配: regex.fullmatch(r&#34;(?e)(?:cats | cat){e&lt; = 1}&#34;,&#34; cat&#34;)。fuzzy_counts(0,0,0) 0个取代,0个插入,0个缺失。