在Python中使用Fuzzywuzzy / rapidfuzz提高字符串匹配性能

如何解决在Python中使用Fuzzywuzzy / rapidfuzz提高字符串匹配性能

我有一本非常大的词典,其中存储了大量的英语句子及其西班牙语翻译。我的原始代码如下:

from fuzzywuzzy import process
sentencePairs = {'How are you?':'¿Cómo estás?','Good morning!':'¡Buenos días!'}
query= 'How old are you?'
match = process.extractOne(query,sentencePairs.keys())[0]
print(match,sentencePairs[match],sep='\n')

然后,我使用RapidFuzz而不是fuzzywuzzy来达到更快的速度。我也尝试了多线程,但是令人惊讶的是它并没有太大帮助。我的新代码如下:

from rapidfuzz import process,utils,fuzz
from concurrent.futures import ThreadPoolExecutor
import time,string,random
random.seed(18)

def findMatch(query,dictionary):    
    match,score = process.extractOne(
       utils.default_process(query),dictionary.keys(),processor=None,scorer=fuzz.ratio)
    return (match,score)

# make a dictionary for testing
d = {
    ''.join(random.choice(string.ascii_lowercase + string.digits)
       for _ in range(15)
    ): "spanish text"
    for s in range(1000000)
}

d['how are you?'] = '¿Cómo estás?'
# split the dictionary in half for multithreading
d1 = dict(list(d.items())[:len(d)//2])
d2 = dict(list(d.items())[len(d)//2:])

query= 'How old are you?'

# ---with multithreading---
start_time1 = time.time()
print('Start matching with multithreading...')

with ThreadPoolExecutor() as executor:
    future = executor.submit(findMatch,query,d1)
    match1,score1 = future.result()

with ThreadPoolExecutor() as executor:
    future = executor.submit(findMatch,d2)
    match2,score2 = future.result()

if score1 >= score2 and score1 > 70:
    print(match1,d[match1],sep=' - ')
elif score2 > score1 and score2 > 70:
    print(match2,d[match2],sep=' - ')
else:
    print('No match found.')

print('Time spent with multithreading: {}\n'.format(time.time() - start_time1))

# ---without multithreading---

start_time2 = time.time()
print('Start matching without multithreading...')

match,score = findMatch(query,d)
if score > 70:
    print(match,d[match],sep=' - ')

print('Time spent without multithreading: {}'.format(time.time() - start_time2))

我认为多线程将大大减少匹配时间,但实际上却相反。有没有一种方法可以大大减少匹配时间?还是我使用错误的多线程方法

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?