我有一根巨大的线和一根针。我想从字符串中找出针的最接近的文本。但是,线和针都使用Unicode(孟加拉语)。我有几种解决方案,但只能使用英语。我没有找到使用Unicode(孟加拉语)的解决方案。请以罗马尼亚语查看以下示例,以更好地了解我的问题。
来源:“ Ceibătrânifac obăuturătoxicăpentru reginajoviană”。
NEEDLE:“băuturăpentrutoxică”
输出:“băuturătoxicăpentru”
来源:“ Ceibătrânifac obăuturătoxicăpentru reginajoviană”。
NEEDLE:“bătrapak obăuturărinan”
输出:“bătrânifac obăutură”
我发现我可以使用余弦或曼哈顿相似度之类的相似度来做到这一点。但是,我认为该算法的实现将很困难。您能否建议我使用任何简单或最快的方法来做到这一点,也许使用php的任何库函数来处理Unicode字符? TIA
答案 0 :(得分:0)
我认为最快的方法是ShpinxSearch Engine:
它具有类似mysql的客户端。您可以执行以下操作:
mysql> SELECT * FROM test WHERE MATCH('băutură pentru toxică');
输出是按最佳匹配顺序排列的文档列表。
================================================ ===============
或尝试在php上创建word-index表(必须根据您的需要优化它的一个非常简单的算法):
function near( $src, $needle) {
$hashIndexes = [];
$words = mb_split(' ', $src);
foreach( $words as $k => $w ) {
$w = mb_strtolower( $w, 'utf-8');
$hashIndexes [sha1( $w )] = [ 'key' => $k, 'word' => $w ];
}
$nWords = mb_split(' ', mb_strtolower( $needle, 'utf-8'));
$matches = [];
foreach( $nWords as $k => $w ) {
$hash = sha1( $w );
if( isset( $hashIndexes [ $hash ]) && $w === $hashIndexes [ $hash ] ['word']) {
$matches [] = $hashIndexes [ $hash ] ['key'];
}
}
if( ! empty( $matches )) {
sort( $matches );
$start = $matches [0];
$last = end( $matches );
$result = array_slice( $words, $start, $last - $start + 1);
return implode( ' ', $result );
} else {
return '';
}
}
$src = "Cei bătrâni fac o băutură some other toxică pentru regina joviană";
$needle ="băutură pentru another toxică";
echo near( $src, $needle) . "\n";
================================================ ===============
优化是一项了不起的工作(google hehehehe)。
.
和,
数组中删除...
,?
,$words
,$nWords
等符号。$hashIndexes [sha1( $w )]
必须是一个数组(因为sha1在其他词上可能相同)$hashIndexes [sha1( $w )] ['key']
也必须是文本中等于单词的数组。我真的建议您安装SphinxSearch或一些类似的文本搜索引擎。