我有一些字符串列表,例如:
["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"]
这个想法是 - 最好的分数得到与子字符串单词位置最匹配的字符串。对于子字符串单词之间“草率”单词的数量越大,它的排序就越低。
我发现了一些像fuzzyset, or 编辑距离但我不确定这就是我需要的。正如我所理解的,我知道我想要排序的确切子字符串,并且这些库搜索相似的单词。
实际上,我需要在 Django 项目中进行一些数据库查询(Postgresql)后进行这种排序。我已经尝试过使用 ORM 进行全文搜索,但没有得到相关的排序顺序(它不计算子字符串单词之间的距离)。接下来我尝试了 Haystack+Whoosh,但此时也没有找到如何进行这种排序的信息。所以现在的想法是获取查询集,然后将其从数据库中排序(是的,我知道这可能是一个糟糕的决定,但现在我希望它能正常工作)。但是,如果有人告诉我如何在我在这里提到的任何技术中做到这一点 - 那也将非常酷。谢谢你!
附注子字符串的长度应为 2-10 个单词,最多 20 个单词的字符串。
您可以使用difflib.序列匹配器,实现与您所需的输出非常相似的结果:
>>> 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"
and "SOME foo TEXT"
与您想要的输出相比被交换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)