在PHP中比较两个字符串的相似性

时间:2016-04-22 03:22:27

标签: php string comparison matching levenshtein-distance

我正在尝试找到比较两个相似字符串并选择它能找到的最相似字符串的最佳解决方案。

我有一系列直接的电影名称。我还有一系列带有附加文字的电影名称。

示例:

我的直接电影名称数组包含如下字符串:

"Super Troopers", 
"Everest", 
"Star Wars: Episode I The Phantom Menace"

我的另一个带有电影字符串的数组的形式类似于以下形式:

"Super Troopers (2001) 720P-AC3-x264", 
"Everest - 2015.1080p.DTS mkv", 
"Star Wars - Episode 1: The Phantom Menace 1080p h265 HEVC TrueHD"

我目前正在做的是循环我的第一个数组,将每个电影与第二个数组进行比较并使用strpos()如果我找到完全匹配,那就太好了。如果不是,我需要执行一些其他功能来查找哪两个字符串最相似。我尝试使用similar_text()levenshtein()混合结果。

在上面的例子中,strpos()可以很好地匹配Everest和Super Troopers,但对于星球大战的字符串,我需要额外的检查。像连字符和冒号和“I”和“1”这样的东西以及电影名称后面的附加信息使用不同似乎给我带有similar_text()levenshtein()的零星结果

我想的可能首先用附加信息对电影名称进行子字符串排序,首先计算电影名称的strlen()加上大约5个左右的附加字符,然后再运行similar_text()levenshtein()函数/ s,因为它们都有一个共同点,就是它们的电影名称位于字符串的开头。这可能会使字符串相似度函数更准确一些吗?

或许某些功能会分解每个单词并检查其他字符串中的匹配数量。这样的功能是否存在?

我会更多地讨论它,但如果有人对如何处理这个问题有任何意见,我很想知道。

感谢。

1 个答案:

答案 0 :(得分:0)

我有一个有趣的解决方案的想法。它使用数据库。每次在集合中获得新电影时,都会将电影名称分隔为单词。例如:

"Star Wars: Episode I The Phantom Menace"

将分为:

"Star", "Wars:", "Episode", "I", "The", "Phantom", "Menace"

从那里,您将在数据库中拥有以下表格:

CREATE TABLE movie_search (
movie_keyword varchar(255) NOT NULL,
movie_id INT NOT NULL,
PRIMARY KEY (movie_keyword)
)

CREATE TABLE movies (
movie_id INT NOT NULL AUTO_INCREMENT,
movie_name varchar(255) NOT NULL,
PRIMARY KEY (movie_id)
)

movie_search表的示例:

key_word | movie_id
star -------- 1
wars -------- 1
spider ------ 2
man --------- 2

电影表的示例:

movie_id | movie_name
1 -------- star wars
2 -------- spider man

每当有人想要在您的网站中搜索电影时,您都会使用explode(" ", $searched_name);将其短语分成所有单词。从那里,您将在数据库中搜索movie_search表中所有匹配的key_word匹配项,如果movie_id重复,您将能够增加为每部电影找到的关键字匹配项的数量。所以在用一些好的PHP进行搜索之后,你的结果应该是一个多维数组,每行有3个元素:

array (
  [0] => array (
    [movie_id] = 1,
    [movie_name] = star wars,
    [count] = 2),
  [1] => array (...),
    ....
)

其中关键字最多(最高计数)的电影会出现在数组的顶部。您还可以通过在SQL代码中放置“ORDER BY 10”来决定要输出的结果数

希望有所帮助! :)