如何加速语言工具Python库用例

问题描述 投票:0回答:4

我有一个 pandas 数据框,其中包含 300 万行社交媒体评论。我正在使用 language-tool-python 库来查找评论中的语法错误数量。 Afaik,语言工具库默认在您的计算机上设置本地语言工具服务器并查询来自该服务器的响应。

获取语法错误的数量只需创建语言工具对象的实例并使用要检查的字符串作为参数调用

.check()
方法。

>>> tool = language_tool_python.LanguageTool('en-US')
>>> text = 'A sentence with a error in the Hitchhiker’s Guide tot he Galaxy'
>>> matches = tool.check(text)
>>> len(matches)
2

所以我用的方法是

df['body_num_errors'] = df['body'].apply(lambda row: len(tool.check(row)))
。现在我很确定这有效。它非常简单。这行代码已经运行了一个小时了。

因为运行上面的示例需要 10-20 秒,所以对于 300 万个实例,它可能几乎需要永远。

有什么方法可以减少损失并加快这个过程吗?迭代每一行并将整个内容放入 threadpoolexecutor 中会有帮助吗?直观上,这对我来说是有意义的,因为它是一个 I/O 绑定任务。

我愿意接受有关如何加快此过程的任何建议,如果上述方法有效,如果有人可以向我展示一些示例代码,我将不胜感激。

编辑 - 更正。

实例化需要10-20秒,调用方法几乎是瞬时的。

python python-multithreading languagetool
4个回答
3
投票

我是

language_tool_python
的创造者。首先,这里的评论没有任何意义。瓶颈在
tool.check()
;使用
pd.DataFrame.map()
一点也不慢。

LanguageTool 正在您计算机上的本地服务器上运行。至少有两种主要方法可以加快速度:

方法一:初始化多个服务器

servers = []
for i in range(100):
  servers.append(language_tool_python.LanguageTool('en-US'))

然后从不同的线程调用每个服务器。或者在每个服务器自己的线程中初始化它。

方法二:增加线程数

LanguageTool 采用

maxCheckThreads
选项 – 请参阅 LT HTTPServerConfig 文档 – 所以您也可以尝试使用它?从LanguageTool的源代码来看,单个LanguageTool服务器中的默认线程数是10。


1
投票

在文档中,我们可以看到

language-tool-python
有配置选项
maxSpellingSuggestions

但是,尽管变量的名称和默认值是

0
,我注意到当这个参数实际设置为
1
时,代码运行速度明显更快(几乎快了2倍)。

我不知道这种差异从何而来,并且文档没有提及有关默认行为的任何具体信息。然而,事实是(至少对于我自己的数据集,我认为这不会影响运行时间)这个设置提高了性能。

初始化示例:

import language_tool_python

language_tool = language_tool_python.LanguageTool('en-US', config={'maxSpellingSuggestions': 1})

0
投票

如果您担心使用 pandas 进行扩展,请改用 Dask。它与 Pandas 集成,并将在您的 CPU 中使用多个内核(我假设您有),而不是 pandas 使用的单核。这有助于并行化 300 万个实例,并可以加快执行时间。您可以在此处阅读有关 dask 的更多信息,或在此处查看示例。


0
投票

确保创建一个实例“语言工具实例”一次。
然后,对于每一行,调用方法“或函数,具体取决于您的代码模式”,其中包括其余的代码逻辑

 matches = tool.check(text)
 len(matches)
© www.soinside.com 2019 - 2024. All rights reserved.