我想检查一下我的OCR结果(一个字符串)是" No Edge"或"无信号"。
问题有时我会得到N0 Edge
,No Signa1
,N0 signa1
,No 5ignal
等。字母o
,S
,{ {1}}和i
有时会成为数字或其他内容。不幸的是,关于OCR,我无能为力。
目前我这样做:
l
你们中的任何人都可以建议一个更聪明的方法吗?
答案 0 :(得分:4)
有一个名为 Simila 的库,专为此类场景设计:
在 Simila 中,你可以拥有:
// A similarity engine which accepts similar if similarity is more than 70%
var simila = new Simila() { Treshold = 0.7 };
if (simila.AreSimilar(ocrResult, "No Edge") || simila.AreSimilar(ocrResult, "No Signal"))
{
// ...
}
这里有一个简单的Simila文档:
https://github.com/mehrandvd/Simila/wiki
仅供参考,我正在研究它,它仍处于测试阶段。如果早期版本可以帮助您,请告诉我,以便为您创建早期版本。
答案 1 :(得分:1)
如果您正在做的工作只是继续这样做,它简单,易于理解并且两次扫描9个字母的字符串不会导致性能问题,除非您有非常大的数据集。 / p>
只需添加评论,以便从现在开始查看此代码的人知道您为什么要查找看似随机的子字符串。
如果这不起作用,那么你要找的是一个"分类算法" (维基百科列表中有79个) - 但它们可能会变得复杂,选择正确的可能会很棘手,所以如果简单的字符串比较能够完成这项工作,那么它们真的是一种矫枉过正。
答案 2 :(得分:1)
嗯.lower比忽略案例的比较慢。当然,如果你在循环中使用它。所以首先我建议你做一个忽略这种情况的比较。为了便于阅读和维护,我建议你重构比较。最后你应该检查字符串是空还是空,然后你不必比较字符串。
示例:
if (IsThereNoEdgeOrNoSignal(ocrResult))
{
//no edge or no signal
}
else
{
//Not no edge or no signal
}
private static bool IsThereNoEdgeOrNoSignal(string ocrResult)
{
if (string.IsNullOrEmpty(ocrResult))
return false;
return ocrResult.IndexOf("edg", StringComparison.CurrentCultureIgnoreCase) >= 0 || ocrResult.IndexOf("gna", StringComparison.CurrentCultureIgnoreCase) >= 0;
}
如果它只停留在这两个字符串上,那么你应该保持这种方式,它是否会增加,你应该用正则表达式检查它。
我希望这有助于你。