Python:如何按子字符串相关性对字符串列表进行排序?


问题内容

我有一些字符串列表,例如:

["foo bar SOME baz TEXT bob",
"SOME foo bar baz bob TEXT",
"SOME foo TEXT",
"foo bar SOME TEXT baz",     
"SOME TEXT"]

我希望按SOME TEXT子字符串的准确性对其进行排序(大写无关紧要)。像这样的命令:

["SOME TEXT",
"foo bar SOME TEXT baz",
"SOME foo TEXT",
"foo bar SOME baz TEXT bob",
"SOME foo bar baz bob TEXT"]

这个想法是-最好的乐谱会获得与子字符串单词位置最匹配的字符串。子字符串的单词之间的“草率”单词数量更大-顺序越低。

我找到了一些类似FuzzysetLevenshtein
distance的
库,但是我不确定这是我所需要的。据我了解,我知道要排序的确切子字符串,并且那些库搜索相似的单词。

实际上,我需要在Django项目中执行一些数据库查询(Postgresql)之后执行这种排序。我已经尝试使用其ORM进行全文本搜索,但是没有获得这种相关的排序顺序(它不计算子字符串词之间的距离)。接下来,我尝试了Haystack
+
Whoosh,但此刻也没有找到有关如何在此进行排序的信息。因此,现在的想法是获取查询集,然后将其从数据库中排序出来(是的,我知道这可能是一个错误的决定,但现在我希望它可以正常工作)。但是,如果有人告诉我如何使用任何一种技术做到这一点,我在这里已经提到过-
这也将非常酷。谢谢!

ps子字符串的长度在最多20个字串中应为2-10个字。


问题答案:

您可以使用difflib。
SequenceMatcher

,以实现与所需输出非常相似的东西:

>>> import difflib
>>> l = ["foo bar SOME baz TEXT bob", "SOME foo bar baz bob TEXT", "SOME foo TEXT", "foo bar SOME TEXT baz", "SOME TEXT"]
>>> sorted(l, key=lambda z: difflib.SequenceMatcher(None, z, "SOME TEXT").ratio(), reverse=True)
['SOME TEXT', 'SOME foo TEXT', 'foo bar SOME TEXT baz', 'foo bar SOME baz TEXT bob', 'SOME foo bar baz bob TEXT']

如果您不能说出唯一的区别,那就是将两个元素"foo bar SOME TEXT baz""SOME foo TEXT"的位置与所需的输出进行交换。