Python 我能找到类似的条目并将它们分组吗?

Python 我能找到类似的条目并将它们分组吗?,python,ruby,algorithm,distance,levenshtein-distance,Python,Ruby,Algorithm,Distance,Levenshtein Distance,我有一个文件,其中包含以下格式的用户输入: 用户正在搜索的图书标题,搜索该条目的次数 示例: 时间的皱纹,100 哈克贝利·费恩历险记,100 及时起皱,20 彼得·潘,100岁 及时溜达,5 哈克贝利·费恩,100 哈克贝利·费恩历险记,150 时间皱纹,2 这本书的书名有很多变化:拼写错误、措辞不正确、顺序不正确或命名略有不同。因此,当列表按标题A->Z排序时,标题不会全部分组在一起: 时间的皱纹,100 及时起皱,20 及时溜达,5 时间皱纹,2 彼得·潘,100岁 哈克贝利·费恩历险记,

我有一个文件,其中包含以下格式的用户输入:

用户正在搜索的图书标题,搜索该条目的次数 示例:

时间的皱纹,100 哈克贝利·费恩历险记,100 及时起皱,20 彼得·潘,100岁 及时溜达,5 哈克贝利·费恩,100 哈克贝利·费恩历险记,150 时间皱纹,2 这本书的书名有很多变化:拼写错误、措辞不正确、顺序不正确或命名略有不同。因此,当列表按标题A->Z排序时,标题不会全部分组在一起:

时间的皱纹,100 及时起皱,20 及时溜达,5 时间皱纹,2 彼得·潘,100岁 哈克贝利·费恩历险记,100 哈克贝利·费恩,100 哈克贝利·费恩历险记,150 《时间上的皱纹》的标题被分组在一起,《哈克贝利·费恩》的标题在各自的组中,而每一行仍然保留其各自的原始数字输入

是否有可能基于模糊逻辑重新排序,或者使用Levenshtein距离,然后通过Python或Ruby进行分组?如果是这样,什么是简单/直接的方法? 这个问题与我的情况类似,只是我使用的是字符串而不是数字。

是的,你可以,我们使用了一些很好的教程。基本上,如果我要这样做,我会使用递归函数来查找匹配项

当我开始使用它的时候,我一开始有一些问题,所以我问

如果您有一组已知项来匹配,那么这就足够简单了,但我的问题解决了您最初不想限制输入集的情况

要开始学习,请参见。

是的,您可以,我们使用了一些很好的教程。基本上,如果我要这样做,我会使用递归函数来查找匹配项

当我开始使用它的时候,我一开始有一些问题,所以我问

如果您有一组已知项来匹配,那么这就足够简单了,但我的问题解决了您最初不想限制输入集的情况


要开始阅读,请参见。

如果您可以获得一份已知的好标题列表,这将使您的生活更加轻松:

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

如果你能得到一份已知的好标题列表,你的生活就会轻松得多:

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

有没有什么地方可以让你得到一份真实的、正确的书名的标准清单?因为那会让生活变得更简单…不幸的是没有。我几乎只是在处理通过谷歌分析的搜索词用户行为部分导出的CSV。GA中的搜索词工具通过解析my site.com/Search?q=的每个条目以及搜索后的内容,告诉我用户在搜索框中输入了什么?q=部分。有没有任何地方可以获得实际的、正确的图书标题的规范列表?因为那会让生活变得更简单…不幸的是没有。我几乎只是在处理通过谷歌分析的搜索词用户行为部分导出的CSV。GA中的搜索词工具通过解析my site.com/Search?q=的每个条目以及搜索?q=部分后面的内容来告诉我用户在搜索框中输入了什么。你应该在每个条目旁边添加分数,这样OP就可以开始“学习”截止位置。同时,这项工作与Recurivity一起进行得更好。谢谢你们!在重新阅读了这些建议并头脑风暴了如何以及在何处获得所需的数据之后,我意识到我可以在数据库上运行查询并获取已知好标题的列表!在结束这篇文章之前,我将尝试一下,并带着我的结果/问题回来。再次感谢!你们太棒了!我尝试了一下,减去@PyNEwbie使用已知标题列表提到的学习递归,我得到了以下结果:回溯最近的调用last:File show title fuzzy logic grouping.py,第1594行,在主文件show title fuzzy logic grouping.py,第1585行,在主搜索中=[最佳标题,intnum,标题对标题,搜索中的num]文件show title fuzzy logic grouping.py,第1579行,在read_csv head=nextincv,None_csv中。错误:在不带引号的字段中看到新行字符-您需要在通用换行模式下打开文件吗?您应该在每一行旁边添加分数,以便OP可以开始“学习”截止点所在的位置。此外,这对recu更有效riveness补充道谢谢你们!在重新阅读了这些建议并进行头脑风暴后,我意识到我可以在我的数据库上运行一个查询,并提取一个已知的好标题列表!在结束此线程之前,我将尝试一下,并返回我的结果/问题。再次-谢谢!您le rock!我尝试了一下,减去@PyNEwbie提到的学习递归,使用了著名的标题列表,我得到了以下信息:回溯最近的一次通话上次:
文件show title fuzzy logic grouping.py,第1594行,在主文件show title fuzzy logic grouping.py,第1585行,在主搜索中=[best_titletle,intnum,title for title,num in search]文件show title fuzzy logic grouping.py,第1579行,在read_csv head=nextincv中,无_csv.Error:在未加引号的字段中看到新行字符-是否需要以通用新行模式打开文件?谢谢!我一直在阅读FuzzyWuzzy,这与使用Hugh Bothwell提到的已知好标题列表的示例方式相结合,给了我一个很好的起点!如果我有足够高的声誉,我会投票!很遗憾,链接的示例已经不存在了。这就是为什么人们应该把例子复制到答案中-谢谢你!我一直在阅读FuzzyWuzzy,这与使用Hugh Bothwell提到的已知好标题列表的示例方式相结合,给了我一个很好的起点!如果我有足够高的声誉,我会投票!很遗憾,链接的示例已经不存在了。这就是为什么人们应该把例子复制到答案中-1.