首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模糊匹配的组织

模糊匹配的组织
EN

Stack Overflow用户
提问于 2015-06-25 04:31:29
回答 3查看 303关注 0票数 0

我已经看过了,并且模糊地匹配了20,000+电影标题列表中的每个元素和其他元素,每个元素都返回一个值:

代码语言:javascript
复制
from fuzzywuzzy import fuzz

titles = ['Scary Movie', 'Happy Movie', 'Sappy Movie', 'Crappy Movie']

print fuzz.ratio(titles[2],titles[3])
>>> 91 #/100 higher value denotes closer match 

for x in titles:
    for y in titles:
        fuzzed = fuzz.ratio(x,y)

    print "value for %r and %r is %r" % (x, y, fuzzed)

如何有效地组织这些数据?更具体地说--如何根据匹配值将匹配组合在一起?

从嵌套循环中捕获返回值,然后用x和y将它们打包到元组或列表中显然是多余和混乱的。我尝试使用类实现,但我遗漏了一些东西。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-25 04:38:45

使用列表理解和itertools.product

代码语言:javascript
复制
from itertools import product
[(x, y, fuzz.ratio(x, y)) for (x, y) in product(titles, repeat=2)]

使用toolz的漂亮和懒惰的解决方案

代码语言:javascript
复制
from toolz.curried import pipe, filter, map
pipe(
    product(titles, repeat=2),
    # No reason to check duplicates
    filter(lambda (x, y): x > y),
    map(lambda (x, y): (x, y, fuzz.ratio(x, y))))
票数 1
EN

Stack Overflow用户

发布于 2015-06-27 21:25:17

您只需要在标题的combinations上迭代,因为比率不取决于顺序。这比迭代它的product要快得多。

对于包含20,000个标题的列表,如果使用400 000 000对,则需要进行迭代。使用combinations,您只需要在199 990 000上进行迭代。

代码语言:javascript
复制
from fuzzywuzzy import fuzz

import collections
import itertools

titles = ['Scary Movie', 'Happy Movie', 'Sappy Movie', 'Crappy Movie']

然后,您可以将这些比率存储在字典中,在字典中,您可以查找一个比率,以获得与该比率成对的set

代码语言:javascript
复制
fuzzes_by_ratio = collections.defaultdict(set)

或者在字典中,您可以查找成对的frozenset并得到它们的比率。

代码语言:javascript
复制
fuzzes_per_pair = {}

-

代码语言:javascript
复制
for m1, m2 in itertools.combinations(titles, 2):
    pair = frozenset({m1, m2})
    ratio = fuzz.ratio(m1, m2)

    fuzzes_by_ratio[ratio].add(pair)
    fuzzes_per_pair[pair] = ratio

然后,您可以在以后检索数据:

代码语言:javascript
复制
# I don't have fuzzywuzzy installed so this is just made up:
>>> fuzzes_by_ratio[91]
{frozenset({"Scary Movie", "Happy Movie"}), frozenset({"Sappy Movie", "Happy Movie"})}

>>> fuzz_per_pair[frozenset({"Scary Movie", "Sappy Movie"})]
82

请记住,此存储将需要大量内存。根据您的需要/方便,只需使用上述两种方法中的一种,就可以将其减半。

票数 1
EN

Stack Overflow用户

发布于 2015-06-25 04:38:42

也许您可以将fuzzed比率存储在字典中,并以(x,y)元组为键,这将使以后更容易搜索到每一对的ratio。为此,您可以在For循环之外创建一个空字典,然后在for循环中将fuzz.ratio(x , y)分配给该字典的键(x, y)

示例代码-

代码语言:javascript
复制
fuzzDict = {}
for x in titles:
    for y in titles:
        fuzzDict[(x,y)] = fuzz.ratio(x,y)

稍后,当您想检索比率时,您可以简单地调用fuzzDict[(x , y)]来获得它。

您也可以在Python中使用字典理解-

代码语言:javascript
复制
{(x, y) : fuzz.ratio(x,y) for x in titles for y in titles}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31041243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档