如何在Unicode字符串中找到相似的Unicode文本?

时间:2018-10-29 07:22:29

标签: php string unicode similarity

我有一根巨大的线和一根针。我想从字符串中找出针的最接近的文本。但是,线和针都使用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

1 个答案:

答案 0 :(得分:0)

我认为最快的方法是ShpinxSearch Engine:

http://sphinxsearch.com/

它具有类似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)。

  1. 您必须从.,数组中删除...?$words$nWords等符号。
  2. $hashIndexes [sha1( $w )]必须是一个数组(因为sha1在其他词上可能相同)
  3. $hashIndexes [sha1( $w )] ['key']也必须是文本中等于单词的数组。
  4. 您必须开发一种算法,该算法必须确定最接近的['key']用于输出最接近的匹配项。
  5. 以此类推。这对每个人来说都是非常艰巨的任务。祝你好运!

我真的建议您安装SphinxSearch或一些类似的文本搜索引擎。