我有一个包含以这种格式的用户输入的文件:
示例:
书名带有变化:拼写错误,措辞不正确,订单不正确或命名略有不同。因为它们,当列表按照标题分类A-> Z时,标题不会全部组合在一起:
A Wrinkle in Time
个标题组合在一起,Huckleberry Finn
个标题位于各自的组中,而每一行仍保留其原始的相应数字输入。
是否可以通过Python或Ruby基于模糊逻辑(可能使用Levenshtein距离然后分组)重新排序?如果是这样,那么简单/直接的方法是什么? 问题Group Similar Entries in Python与我的情况类似,只是我使用的是字母串而不是数字。
答案 0 :(得分:2)
是的,你可以,我们使用FuzzyWuzzy有一些很好的教程。基本上如果我要这样做,我会使用递归函数来查找匹配项。
当我开始使用它时,我最初遇到了一些问题,因此我问this question。
如果你有一组已知的项目可以匹配,那么它是直截了当的,但是我的问题解决了你最初不想限制输入集的情况。
要开始,请参阅this example。
答案 1 :(得分:2)
如果你能得到已知好名单的清单,它会让你的生活更轻松:
import csv
from fuzzywuzzy import process
from itertools import groupby
good_titles = [
"a wrinkle in time",
"the adventures of huckleberry finn",
"peter pan"
]
def best_title(title):
return process.extractOne(title.lower(), choices=good_titles)[0]
def read_csv(fname, header=False, **kwargs):
with open(fname, "rb") as inf:
incsv = csv.reader(inf, **kwargs)
if header:
head = next(incsv, None)
for row in incsv:
yield row
def main():
searches = read_csv("search_data.csv", header=True)
searches = [(best_title(title), int(num), title) for title,num in searches]
searches.sort(key=lambda x: (x[0], -x[1], x[2]))
for key,items in groupby(searches, lambda s:s[0]):
for bt, num, t in items:
print("{:40} {:>5}".format(t, num))
print('')
if __name__=="__main__":
main()
产生
A Wrinkle in Time 100
Wrinkle in Time 20
rinkle in time 5
Time wrinkle 2
Peter Pan 100
Adventures of Huckleberry Finn 150
Huckleberry Finn 100
The Adventures of Huckleberry Finn 100