我正在尝试找到比较两个相似字符串的最佳解决方案,并选择它能找到的最相似的字符串。
我有一系列直截了当的电影名字。我还有一系列带有附加文本的电影名称。
例:
我的直接电影名称数组包含如下字符串:
"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()
可以很好地匹配珠穆朗玛峰和超级骑兵,但对于星球大战字符串,我需要额外的检查。诸如连字符和冒号以及"I"和"1"之类的东西以及电影名称后面的其他信息似乎给了我零星的结果,similar_text()
和levenshtein()
我正在考虑在运行 similar_text()
或 levenshtein()
函数之前,可能首先通过计算电影名称的strlen()
加上 5 个左右的额外字符来子串出带有附加信息的电影名称,因为它们都有一个共同点是它们的电影名称位于字符串的开头。这可以使字符串相似性函数可能更准确一些?
或者也许是一些函数来分解每个单词并检查另一个字符串中有多少匹配。这样的功能存在吗?
我会更多地搞砸它,但如果有人对他们如何解决这个问题有任何意见,我很想知道。
谢谢。
我有一个有趣的解决方案的想法。它使用数据库。每次收藏中有新电影时,您都会将电影名称分成单词。例如:
"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"来决定要输出多少结果
希望对您有所帮助!