如何检查数组的值是否与给定字符串相似?

时间:2016-04-27 14:17:37

标签: php arrays string sorting similarity

目前正致力于执行以下项目:

  1. 在大量文本中获取2到5个单词之间最常用的短语(一切都很好)
  2. 使用$ phrase =>返回一个数组$出现
  3. 我现在想要获取此数组中的每个值并检查数组的其余部分是否存在类似的值,如果是,请将它们合并为一个并总结它们的出现次数。

    我想使用 similar_text()来比较与短语的相似程度,以及它是否与> 95,然后我想合并它们。

    最有效的方法是什么?我试图以毫秒为单位进行优化。

    现在,我正在使用这个...但它很糟糕,有10 / 30k字的文章。特别是当我在数十个循环中时。

    function merge_similar_phrases( $original, $threshold = 90 ) {
    
        foreach ( $original as $phrase => $occurrences ) {
    
            foreach ( $original as $s => $n ) {
    
                similar_text( $phrase, $s, $percent );
    
                if( $percent > 92.5 ) {
    
                    $original[$phrase] = $occurrences + $n;
                    unset( $original[$s] );
    
                }
    
            }
    
        }
    
        return $original;
    
    }
    

    谢谢!

1 个答案:

答案 0 :(得分:0)

为了提高性能,您可以自己保存一个foreach循环并将其替换为array_filter。我记得这样的事情:

foreach ( $original as $phrase => $occurrences ) {

    $similarities = array_filter($original, function($key) use($phrase, $threshold) {
        similar_text( $phrase, $key, $percent );
        if($percent > $threshold){
            return true;
        }
        return false;
    }, ARRAY_FILTER_USE_KEY);
    unset($similarities[$phrase]);
    //do the magic with similarities
}

你必须使用php 5.6+才能使用ARRAY_FILTER_USE_KEY标志(如文档中所述:http://php.net/manual/en/function.array-filter.php

但是我不确定你可以花多少时间做这件事。