Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Levenshtein-分组酒店名称_Php_String_Algorithm_Grouping_Levenshtein Distance - Fatal编程技术网

Php Levenshtein-分组酒店名称

Php Levenshtein-分组酒店名称,php,string,algorithm,grouping,levenshtein-distance,Php,String,Algorithm,Grouping,Levenshtein Distance,我必须根据一些旅馆的名字把它们归为同一类。我使用levenshtein进行分组,但我已经尝试了很多次,一些酒店超出了它们应该属于的类别,或者属于另一个类别 例如:所有这些酒店应属于同一类别: ============================= 贝西河高切最佳西方酒店 科利西最佳西方酒店 勃艮第公爵最佳西方酒店 最佳西方福克斯通歌剧院 最佳西方法国欧洲酒店 悉尼歌剧院最佳西方酒店 最佳西方巴黎卢浮宫歌剧院 纽维尔最佳西方酒店 ============================= 我有

我必须根据一些旅馆的名字把它们归为同一类。我使用levenshtein进行分组,但我已经尝试了很多次,一些酒店超出了它们应该属于的类别,或者属于另一个类别

例如:所有这些酒店应属于同一类别:

=============================

贝西河高切最佳西方酒店

科利西最佳西方酒店

勃艮第公爵最佳西方酒店

最佳西方福克斯通歌剧院

最佳西方法国欧洲酒店

悉尼歌剧院最佳西方酒店

最佳西方巴黎卢浮宫歌剧院

纽维尔最佳西方酒店

=============================

我有一个所有酒店名称的列表(比如1000行)。我也有他们应该如何分组。 你知道如何优化levenshtein,让它更适合我的情况吗

$inserted = false;
foreach($hotelList as $key => $value){
    if (levenshtein($key, $hotelName, 2, 5, 1) <= abs(strlen($key) - strlen($hotelName))){
        array_push($hotelList[$key], trim($line));
        $inserted = true;
    }
}
// if no match was found add another entry
if (!$inserted){
    $hotelList[$hotelName] = array(
            trim($line)
        );
}
$inserted=false;
foreach($key=>$value的hotelList){

如果(levenshtein($key,$hotelName,2,5,1)您将哪些levenshtein距离值视为要作为同一组的一部分的单词之间的差值?似乎您倾向于根据最初的几个单词对酒店进行分组,这将需要完全不同的方法(如字典排序、比较当前字符串和下一个字符串等)但是,如果你的用例仍然需要计算LevsHeTin距离,那么我建议你根据它们的长度对字符串排序,然后开始比较每个字符串和其他长度相似的字符串(应用你自己的试探法,把你认为是‘相似’的,就像你可以说是相似的=数学。ABS(STR1长度- STR2。长度))。我会深入思考。首先,像这样对数据进行分组或“聚类”是一个相当大的话题,我不会特别深入讨论,但可能会指出一个理想的方向

通过对所比较字符串的长度进行规范化,您做了一件了不起的事情——这完全正确,因为您避免了在许多情况下字符串的长度会过度确定相似性的问题

但算法并没有解决问题。首先,我们想比较一下单词。“Bent East French Hotels”显然与“Best Western French Hotels”有很大不同,但它的得分要高于“Best Western Paris Bed and Breakfasts”这里要理解的直觉是,你的代词不应该是字符,而应该是单词

我喜欢@saury的答案,但我不确定一开始的假设。相反,让我们从一个好的、简单的、经常被称为“”的东西开始。然后我们实施一个技巧,让你根据直觉来识别关键短语,即使用最少的词包含最多的信息

如果你认同酒店品牌名称接近开头的观点,那么你也可能会对其接近开头的位置产生偏差。事实是,你的团队最终很可能是“法国”和“最佳”/“西方”(但不是“酒店”-为什么?)

你想让你的结果更准确

从现在开始,我们必须进一步研究一些严肃的算法——享受浏览许多堆栈溢出主题的乐趣。我的直觉是,我打赌许多酒店名称根本没有品牌,所以你也需要为它们设置不同的类别。我的直觉是,酒店名称中重复的单词数量将相对较少-有些词可能是酒店名称中经常出现的成员。这些事实可能是上述问题。在这种情况下,有一种非常流行的(如果是陈词滥调的话)技术称为k-means,这是一个有趣的介绍,它将扩展一个算法,如(非常勇敢地用php编写)将你选择的n个关键短语作为集群的n维,然后将集群中心点的大部分组成部分作为你的分类标签(这将消除“France”,比如说,因为“France”的点击将相当均匀地分布在n维空间中)


这可能是一个小问题,但我想强调的是,如果您的数据没有结构化,那么就没有任何捷径可以让您正确地进行操作。

您可能需要阅读相关内容和一般内容。

您确实应该提供实际的代码。一个选项是添加一个ode>chain
company
列到您的数据库表中会认为levenshtein是相当优化的-您可能只想编写一个不同的算法。大的实际问题是-您都知道酒店名称了吗?我编辑了这篇文章。我有一个酒店的示例列表,以及它们应该如何分组。嗯……我在想一个问题关于最初的假设,即酒店品牌将出现在一开始。这将导致一个伟大的方法,正如你所描述的,但这个假设真的是真的吗?我想只有OP可以说。