Python: 有没有比使用自动更正进行拼写更正更快的方法?
Python: Is there a faster way than using autocorrect for spell correction?
我正在进行情绪分析,并且有 train
和 test
csv 文件,其中包含 train
数据框(在读取 csv 文件后创建),其中包含列 text
和sentiment
.
在 google-colab 中尝试过:
!pip install autocorrect
from autocorrect import spell
train['text'] = [' '.join([spell(i) for i in x.split()]) for x in train['text']]
但要花很长时间才能停下来。有没有更好的方法来自动更正 pandas 列?怎么做?
P.S.: 数据集足够大,大约有 5000 行,每个 train['text']
值大约有 300 个单词,类型为 str
。我没有把train['text']
分成句子。
首先,一些示例数据:
from typing import List
from autocorrect import spell
import pandas as pd
from sklearn.datasets import fetch_20newsgroups
data_train: List[str] = fetch_20newsgroups(
subset='train',
categories=['alt.atheism', 'talk.religion.misc', 'comp.graphics', 'sci.space'],
shuffle=True,
random_state=444
).data
df = pd.DataFrame({"train": data_train})
语料库大小:
>>> df.shape
(2034, 1)
文档的平均字符长度:
>>> df["train"].str.len().mean()
1956.4896755162242
第一个观察结果:spell()
(我从未使用过 autocorrect
)确实 很慢。 一个文档!
只需要7.77s
>>> first_doc = df.iat[0, 0]
>>> len(first_doc.split())
547
>>> first_doc[:100]
'From: dbm0000@tm0006.lerc.nasa.gov (David B. Mckissock)\nSubject: Gibbons Outlines SSF Redesign Guida'
>>> %time " ".join((spell(i) for i in first_doc.split()))
CPU times: user 7.77 s, sys: 159 ms, total: 7.93 s
Wall time: 7.93 s
因此,该函数可能是您的瓶颈,而不是在矢量化 Pandas 方法或 .apply()
之间进行选择。假设此文档的长度大约是平均值的 1/3,则粗略计算的非并行计算总时间为 7.93 * 3 * 2034 == 48,388 秒。不好看
为此,考虑并行化。这是一项高度并行化的任务:在文档集合中应用一个 CPU 绑定的简单可调用对象。 concurrent.futures
对此有一个简单的 API。此时,您可以将数据结构从 Pandas 中取出并放入轻量级的东西中,例如列表或元组。
示例:
>>> corpus = df["train"].tolist() # or just data_train from above...
>>> import concurrent.futures
>>> import os
>>> os.cpu_count()
24
>>> with concurrent.futures.ProcessPoolExecutor() as executor:
... corrected = executor.map(lambda doc: " ".join((spell(i) for i in doc)), corpus)
我正在进行情绪分析,并且有 train
和 test
csv 文件,其中包含 train
数据框(在读取 csv 文件后创建),其中包含列 text
和sentiment
.
在 google-colab 中尝试过:
!pip install autocorrect
from autocorrect import spell
train['text'] = [' '.join([spell(i) for i in x.split()]) for x in train['text']]
但要花很长时间才能停下来。有没有更好的方法来自动更正 pandas 列?怎么做?
P.S.: 数据集足够大,大约有 5000 行,每个 train['text']
值大约有 300 个单词,类型为 str
。我没有把train['text']
分成句子。
首先,一些示例数据:
from typing import List
from autocorrect import spell
import pandas as pd
from sklearn.datasets import fetch_20newsgroups
data_train: List[str] = fetch_20newsgroups(
subset='train',
categories=['alt.atheism', 'talk.religion.misc', 'comp.graphics', 'sci.space'],
shuffle=True,
random_state=444
).data
df = pd.DataFrame({"train": data_train})
语料库大小:
>>> df.shape
(2034, 1)
文档的平均字符长度:
>>> df["train"].str.len().mean()
1956.4896755162242
第一个观察结果:spell()
(我从未使用过 autocorrect
)确实 很慢。 一个文档!
>>> first_doc = df.iat[0, 0]
>>> len(first_doc.split())
547
>>> first_doc[:100]
'From: dbm0000@tm0006.lerc.nasa.gov (David B. Mckissock)\nSubject: Gibbons Outlines SSF Redesign Guida'
>>> %time " ".join((spell(i) for i in first_doc.split()))
CPU times: user 7.77 s, sys: 159 ms, total: 7.93 s
Wall time: 7.93 s
因此,该函数可能是您的瓶颈,而不是在矢量化 Pandas 方法或 .apply()
之间进行选择。假设此文档的长度大约是平均值的 1/3,则粗略计算的非并行计算总时间为 7.93 * 3 * 2034 == 48,388 秒。不好看
为此,考虑并行化。这是一项高度并行化的任务:在文档集合中应用一个 CPU 绑定的简单可调用对象。 concurrent.futures
对此有一个简单的 API。此时,您可以将数据结构从 Pandas 中取出并放入轻量级的东西中,例如列表或元组。
示例:
>>> corpus = df["train"].tolist() # or just data_train from above...
>>> import concurrent.futures
>>> import os
>>> os.cpu_count()
24
>>> with concurrent.futures.ProcessPoolExecutor() as executor:
... corrected = executor.map(lambda doc: " ".join((spell(i) for i in doc)), corpus)