【问题标题】:How to speed up language-tool-python library use case如何加速语言工具python库用例
【发布时间】:2022-08-24 03:40:43
【问题描述】:

我有一个带有 300 万行社交媒体 cmets 的 pandas 数据框。我正在使用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 秒,调用该方法几乎是瞬时的。

  • 也许首先尝试使用threadpoolexecutor。甚至在您的链接中也有示例代码。
  • 只有tool.check 需要10-20 秒,还是包括实例化LanguageTool?
  • @furas 我估计它现在需要大约几天的时间,如果它工作线程,它可能需要几个小时,我不想承诺解决方案,然后我才能相当有信心它会工作。因为我不知道它是否会在很长一段时间内完成。
  • 我们不能说它是否适用于您的情况 - 您必须运行代码来测试它。
  • @roland-smith,我的错,实例化需要 10-20 秒,调用该方法几乎是瞬时的。

标签: python python-multithreading languagetool


【解决方案1】:

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

【讨论】:

  • 在这个特定的用例中,并行化并不像使用 processpool 或第三方包那样简单,因为 .apply() 的每次迭代都会向服务器发出请求,并且 dask 后端在发生这种情况时默认为单核或引发错误。但是,有一些解决方法,所以并行化就是答案。
  • 你最终做了什么来解决这个错误?
  • 由于并行化的工作量太大,所以我使用了 numpy vectorize 功能,pandas .apply() 函数是后端的 for 循环,因此它不是最快的。
  • @FardinAhsan 尽可能使用 numpy 总是一个好主意。
【解决方案2】:

我是language_tool_python 的创建者。首先,这里的 cmets 都没有意义。瓶颈在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 的源代码看,default number of threads in a single LanguageTool server 似乎是 10。

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多