php - PHP词比较和加权
问题描述
我目前正在为我正在从事的项目编写搜索匹配。作为搜索的一部分,我将使用精确关键字、短语和其他指标的广泛组合来为搜索结果提供加权分数。
目的是允许将单词 a 与单词/字符串 b 进行比较,并提供返回的加权分数。所以完全匹配将提供 100%。
然后,该分数成为更大数学函数的一部分,因此搜索匹配准确性不仅仅基于此(以防万一那是印象),这仅与显示的匹配的相对权重有关。
function search_match($a, $b, $s, $audit = 0) /* a = needle, b = haystack, $s = score, adit allow print of match type*/
{
$a = strtolower($a);
$b = strtolower($b);
$c = explode(' ', $a);
$d = explode(' ', $b);
if ( $a === $b ) { $s = $s; $t='Equal match'; }
else if ( $a == $b ) { $s = $s * 0.9; $t='Almost equal match'; }
else if (metaphone($a)==metaphone($b)){ $s = $s * 0.75; $t='Metaphone match'; } /* word structure matching */
else if ( levenshtein($a, $b) == 0 ) { $s = $s * 0.7; $t='Levenshtein'; } /* Typo capture*/
else if ( strpos($a,$b) !== false ) { $s = $s * 0.6; $t='A in B'; }
else if ( strpos($b,$a) !== false ) { $s = $s * 0.5; $t='B in A'; }
else if ( is_array($d) && in_array($a , $d)) { $s = $s * 0.4; $t='Part of A in part of B'; }
else if ( is_array($c) && in_array($b , $c)) { $s = $s * 0.3; $t='Part of B in part of A'; }
else { $s = 0; $t='No match'; }
return ($audit===1)? $t:$s;
}
所以,我正在寻找一些支持来完善这一点,特别是: 1. 你是否同意与比赛相关性应用的得分比率?2. 您能否建议任何其他匹配标准或更好的匹配顺序。
我的希望是提供一个很好的单词匹配功能,可以在我的项目之外使用,我在这里看到了类似的片段和 strops 等,但没有任何东西真正“加权”匹配。
编辑:
- 如果没有匹配则错过 0.... Doh
- 按照@Fatfreddy 的建议添加了变音位和 Levenshtein 权重
- 添加了返回匹配类型文本的选项,以便了解如何计算得分。只需通过 audit = 1 即可返回匹配的文本。
解决方案
参考 levenshtein 算法
$a = 'How are you?'; // simple word matching in PHP
if (strpos($a, 'are') !== false) {
echo 'true';
}
推荐阅读
- r - 运行 do.call() 函数而不打印其所有参数
- vba - 在日历中搜索某个时间段内的约会
- ruby - 对机器人 DM 的 Slack 模态提交响应无法在不同的工作空间上工作
- javascript - Redux“纯”函数
- python - 为什么在 Python 断点()中执行注释会导致“*** SyntaxError:解析时意外 EOF”?
- r - 如何在 RShiny 的 UI 中左右对齐部分文本?
- terraform - 是否可以将 Docker 映像从公共 Docker 集线器移动到 aws ecs?
- c# - 如何查找gps数据并将其统一存储在变量中
- r - 通过基于具有部分字符串匹配的命名向量的查找子集向量/替换值
- wpf - 如何将 HierarchicalDataTemplate 中的 xaml 代码移动到资源