我有一个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秒,调用该方法几乎是瞬间的。
3条答案
按热度按时间dpiehjr41#
如果你担心Pandas的规模扩大,那就改用达斯克吧。它与Pandas集成在一起,将在你的CPU中使用多核,我假设你有,而不是Pandas使用的单核。这有助于并行化300万个示例,并可以加快执行速度。您可以阅读有关Daskhere的更多信息,或在此处查看示例。
3lxsmp7m2#
I'm the creator of
language_tool_python
. First, none of the comments here make sense. The bottleneck is intool.check()
; there is nothing slow about usingpd.DataFrame.map()
.LanguageTool is running on a local server on your machine. There are at least two major ways to speed this up:
Method 1: Initialize multiple servers
Then call to each server from a different thread. Or alternatively initialize each server within its own thread.
Method 2: Increase the thread count
LanguageTool takes a
maxCheckThreads
option – see the LT HTTPServerConfig documentation – so you could also try playing around with that? From a glance at LanguageTool's source code, it looks like the default number of threads in a single LanguageTool server is 10.83qze16e3#
在文档中,我们可以看到
language-tool-python
具有配置选项maxSpellingSuggestions
。然而,尽管变量的名称和缺省值为
0
,但我注意到,当此参数实际设置为1
时,代码的运行速度明显更快(几乎快了2倍)。我不知道这种差异是从哪里来的,文档也没有提到任何关于默认行为的具体内容。然而,事实是(至少对于我自己的数据集,我认为它不会对运行时间产生如此大的影响),这个设置提高了性能。
初始化示例: