我有一个 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秒,调用方法几乎是瞬时的。
我是
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。
在文档中,我们可以看到
language-tool-python
有配置选项maxSpellingSuggestions
。
但是,尽管变量的名称和默认值是
0
,我注意到当这个参数实际设置为1
时,代码运行速度明显更快(几乎快了2倍)。
我不知道这种差异从何而来,并且文档没有提及有关默认行为的任何具体信息。然而,事实是(至少对于我自己的数据集,我认为这不会影响运行时间)这个设置提高了性能。
初始化示例:
import language_tool_python
language_tool = language_tool_python.LanguageTool('en-US', config={'maxSpellingSuggestions': 1})
确保创建一个实例“语言工具实例”一次。
然后,对于每一行,调用方法“或函数,具体取决于您的代码模式”,其中包括其余的代码逻辑
matches = tool.check(text)
len(matches)