首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在数组中找到类似的单词并消除它们

在数组中找到类似的单词并消除它们
EN

Stack Overflow用户
提问于 2022-09-20 14:03:33
回答 2查看 79关注 0票数 2
代码语言:javascript
复制
$a[] = "paris";
$a[] = "london";
$a[] = "paris";
$a[] = "london tour";
$a[] = "london tours";
$a[] = "london";
$a[] = "londonn";

foreach($a as $name) {

echo $name;
echo '<br>';

}

输出:

代码语言:javascript
复制
paris
london
paris
london tour
london tours
london
londonn

我可以用array_unique删除相同的单词。

代码语言:javascript
复制
foreach(array_unique($a) as $name) {

echo $name;
echo '<br>';

}

输出:

代码语言:javascript
复制
paris
london
london tour
london tours
londonn

我想更进一步,去掉类似的字眼。比如,如果有一个“伦敦”,我想消除“伦敦”。

因此,输出将是:

代码语言:javascript
复制
paris
london
london tour

我尝试了similar_text($name,$name,$percent),但是没有帮助。

以下是我用有限的知识所做的尝试:

代码语言:javascript
复制
foreach(array_unique($a) as $name) {

$test = $a;
foreach($test as $test1) {

 similar_text($name, $test1, $percent);
if ($percent > 90) {
echo $name;
echo '<br>';
} 

}
}

输出:

代码语言:javascript
复制
paris
paris
london
london
london
london tour
london tour
london tours
london tours
londonn
londonn
londonn

这些词的来源是一个搜索列表:

$a[] = "$popular_search";

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-20 14:30:03

主要问题似乎是使用这两个嵌套循环的方式。这里有一个非常显式的例子,没有任何花哨的东西,展示了如何做到这一点:

代码语言:javascript
复制
$a[] = "paris";
$a[] = "london";
$a[] = "paris";
$a[] = "london tour";
$a[] = "london tours";
$a[] = "london";
$a[] = "londonn";

$b = [];
foreach($a as $outerName) {
    // start optimistic, no similar string found
    $isUnique = true;
    foreach($b as $innerName) {
        // check whether the string already has a similar entry
        similar_text($outerName, $innerName, $percent);
        if ($percent > 90) {
            $isUnique = false;
            break;
        }
    }
    if ($isUnique) {
        $b[] = $outerName;
    }
}

print_r($b);

工作实例

产出如下:

代码语言:javascript
复制
Array
(
    [0] => paris
    [1] => london
    [2] => london tour
)

它怎麽工作?有一个外部循环,它简单地遍历数组$a中的所有字符串。在该循环中,它循环遍历已经被标识为足够唯一的字符串$b。如果来自$a的字符串与$b字符串非常相似,那么我们跳过它。就这样。

票数 3
EN

Stack Overflow用户

发布于 2022-09-20 14:11:57

您可以使用函数返回的%%部分.这将返回两个输入之间的相似性百分比。

对于我实现的一个单词游戏,我使用了这种方法,并且对我来说“匹配”这个单词,测试>= 60到80的百分比似乎适用于“大多数”我的测试用例,这取决于您希望它是多么的挑剔!

就我的情况而言,为了使它准确,我首先将测试词转换为隐喻:

代码语言:javascript
复制
public static function testMetaphone($s1 = "", $s2 = "", $phonemes = 4)
{
    if (empty($s1) || empty($s2)) {
        return false;
    }

    $m1 = metaphone($s1, $phonemes);
    $m2 = metaphone($s2, $phonemes);
    $sim = similar_text($m1, $m2, $perc);
    $logMessage = "M1: {$m1}, M2: {$m2}, Similarity: $sim ($perc %) - Originals text: {$s1} | {$s2}";
    Log::info("testMetaphone: " . $logMessage);
    // Test accuracy
    if ($perc >= 85) {
        return true;
    } else {
        return false;
    }
}

用法:

代码语言:javascript
复制
$answerCheck = testMetaphone("Toyota", "Totota", 6);

看到它的作用:https://3v4l.org/KceXD -上面的失败,如果%-年龄是85%,但通过如果%60。所以,再一次,可能需要玩这个,以找到你满意的地方,它的准确性。

对于您的情况,您可以循环数组,并使用此函数将每个元素与每个其他元素进行比较,并跟踪每个单词的选中情况,以及有多少相似的条目,然后相应地删除“重复项”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73788025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档