我能找到类似的条目并将它们组合在一起吗?

时间:2014-03-09 01:16:52

标签: python ruby algorithm distance levenshtein-distance

我有一个包含以这种格式的用户输入的文件:

  • 用户搜索的图书标题,搜索条目的次数

示例:

  • 时间皱纹,100
  • Huckleberry Finn历险记,100
  • 时间皱纹,20
  • Peter Pan,100
  • rinkle及时,5
  • Huckleberry Finn,100
  • Huckleberry Finn历险记,150
  • 时间皱纹,2

书名带有变化:拼写错误,措辞不正确,订单不正确或命名略有不同。因为它们,当列表按照标题分类A-> Z时,标题不会全部组合在一起:

  • 时间皱纹,100
  • 时间皱纹,20
  • rinkle及时,5
  • 时间皱纹,2
  • Peter Pan,100
  • Huckleberry Finn历险记,100
  • Huckleberry Finn,100
  • Huckleberry Finn历险记,150

A Wrinkle in Time个标题组合在一起,Huckleberry Finn个标题位于各自的组中,而每一行仍保留其原始的相应数字输入。

是否可以通过Python或Ruby基于模糊逻辑(可能使用Levenshtein距离然后分组)重新排序?如果是这样,那么简单/直接的方法是什么? 问题Group Similar Entries in Python与我的情况类似,只是我使用的是字母串而不是数字。

2 个答案:

答案 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