Php Levenshtein-分组酒店名称
我必须根据一些旅馆的名字把它们归为同一类。我使用levenshtein进行分组,但我已经尝试了很多次,一些酒店超出了它们应该属于的类别,或者属于另一个类别 例如:所有这些酒店应属于同一类别: ============================= 贝西河高切最佳西方酒店 科利西最佳西方酒店 勃艮第公爵最佳西方酒店 最佳西方福克斯通歌剧院 最佳西方法国欧洲酒店 悉尼歌剧院最佳西方酒店 最佳西方巴黎卢浮宫歌剧院 纽维尔最佳西方酒店 ============================= 我有一个所有酒店名称的列表(比如1000行)。我也有他们应该如何分组。 你知道如何优化levenshtein,让它更适合我的情况吗Php Levenshtein-分组酒店名称,php,string,algorithm,grouping,levenshtein-distance,Php,String,Algorithm,Grouping,Levenshtein Distance,我必须根据一些旅馆的名字把它们归为同一类。我使用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可以说。