我已经看过了,并且模糊地匹配了20,000+电影标题列表中的每个元素和其他元素,每个元素都返回一个值:
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将它们打包到元组或列表中显然是多余和混乱的。我尝试使用类实现,但我遗漏了一些东西。
发布于 2015-06-25 04:38:45
使用列表理解和itertools.product
from itertools import product
[(x, y, fuzz.ratio(x, y)) for (x, y) in product(titles, repeat=2)]使用toolz的漂亮和懒惰的解决方案
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))))发布于 2015-06-27 21:25:17
您只需要在标题的combinations上迭代,因为比率不取决于顺序。这比迭代它的product要快得多。
对于包含20,000个标题的列表,如果使用400 000 000对,则需要进行迭代。使用combinations,您只需要在199 990 000上进行迭代。
from fuzzywuzzy import fuzz
import collections
import itertools
titles = ['Scary Movie', 'Happy Movie', 'Sappy Movie', 'Crappy Movie']然后,您可以将这些比率存储在字典中,在字典中,您可以查找一个比率,以获得与该比率成对的set。
fuzzes_by_ratio = collections.defaultdict(set)或者在字典中,您可以查找成对的frozenset并得到它们的比率。
fuzzes_per_pair = {}-
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然后,您可以在以后检索数据:
# 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请记住,此存储将需要大量内存。根据您的需要/方便,只需使用上述两种方法中的一种,就可以将其减半。
发布于 2015-06-25 04:38:42
也许您可以将fuzzed比率存储在字典中,并以(x,y)元组为键,这将使以后更容易搜索到每一对的ratio。为此,您可以在For循环之外创建一个空字典,然后在for循环中将fuzz.ratio(x , y)分配给该字典的键(x, y)。
示例代码-
fuzzDict = {}
for x in titles:
for y in titles:
fuzzDict[(x,y)] = fuzz.ratio(x,y)稍后,当您想检索比率时,您可以简单地调用fuzzDict[(x , y)]来获得它。
您也可以在Python中使用字典理解-
{(x, y) : fuzz.ratio(x,y) for x in titles for y in titles}https://stackoverflow.com/questions/31041243
复制相似问题