【发布时间】:2012-02-24 04:40:24
【问题描述】:
我正在尝试从多个字符串中提取相似的部分。
这样做的目的是尝试从书名页的多个 OCR 中提取书名。
这仅适用于字符串的开头,字符串的结尾不需要修剪,可以保持原样。
例如,我的字符串可能是:
$title[0]='the history of the internet, expanded and revised';
$title[1]='the history of the internet';
$title[2]='published by xyz publisher the historv of the internot, expanded and';
$title[3]='history of the internet';
所以基本上我想修剪每个字符串,使其从最可能的起点开始。考虑到可能存在 OCR 错误(例如“historv”、“internot”),我认为最好从每个单词中获取字符数,这将为每个字符串提供一个数组(所以是一个多维数组)每个单词的长度。然后可以使用它来查找正在运行的匹配项并将字符串的开头修剪到最有可能的位置。
字符串应该被剪成:
$title[0]='the history of the internet, expanded and revised';
$title[1]='the history of the internet';
$title[2]='the historv of the internot, expanded and';
$title[3]='XXX history of the internet';
所以我需要能够识别“互联网历史”(7 2 3 8)是匹配所有字符串的运行,并且前面的“the”很可能是正确的,因为它出现在 >50 % 的字符串,因此每个字符串的开头都被修剪为“the”,并且在缺少“the”的字符串上添加了一个相同长度的占位符。
到目前为止,我得到了:
function CompareSimilarStrings($array)
{
$n=count($array);
// Get length of each word in each string >
for($run=0; $run<$n; $run++)
{
$temp=explode(' ',$array[$run]);
foreach($temp as $key => $val)
$len[$run][$key]=strlen($val);
}
for($run=0; $run<$n; $run++)
{
}
}
如您所见,我一直在寻找正在运行的比赛。
有什么想法吗?
【问题讨论】:
-
OCR 会不会漏掉一个短单词或者认为一个字母是一个符号?这些“跑步比赛”似乎不适用于这种可能性。
-
它不会漏词,它经常会弄错一个字母,但这就是为什么我想使用每个单词中的字母数。有时它会添加或删除一个字母,但脚本仍然会匹配那些没问题的字符串。
-
我还想问:为什么标题不是“互联网的历史,扩展和”?它与 50% 的样本很好地匹配,并且一个大的子集与其余的情况匹配。是否可以保证每个样本都包含完整的标题?这是我能想到的唯一明确的规则,它会使这个答案无效。
-
没错,但我只想用这个脚本开始剪辑。然后我有另一种算法将它们组合成一个字符串,它考虑了结尾。
-
我明白了。那么,如果你只关心最有可能的开始,为什么一连串的词很重要呢?这应该只要求一次考虑一个单词,从左到右。如果我们先查看“已发布”,我们会发现它不是很受欢迎。当我们努力研究“the”时,我们发现它非常流行,而“history”则不那么流行了。因此,我们将选择“the”。然后,您的其他算法将担心结局。您可能会注意到,如果真正的标题是“已发布 Internet 的历史”,那么这个算法会得出错误的结论,但是根据什么度量?