Python:是否有比使用自动更正进行拼写更快速的方法?

时间:2019-08-09 12:49:06

标签: python pandas dataframe spell-checking autocorrect

我正在进行情感分析,并且有mistakeChecktrain个csv文件,其数据帧为test(在读取csv文件后创建),其数据列为train和{{ 1}}。

在google-colab中尝试过

text

但是要永远停下来。有没有更好的方法来自动更正熊猫列?怎么做?

P.S .:数据集足够大,大约有5000行,每个sentiment值大约有300个单词,并且类型为!pip install autocorrect from autocorrect import spell train['text'] = [' '.join([spell(i) for i in x.split()]) for x in train['text']] 。我train['text']分解为句子。

1 个答案:

答案 0 :(得分:1)

首先,提供一些示例数据:

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})

Corpus大小:

>>> df.shape
(2034, 1)

文档平均长度(以字符为单位):

>>> df["train"].str.len().mean()
1956.4896755162242

第一次观察:spell()(我从没用过autocorrect)很慢。只需一个文档只需花费7.77秒!

>>> 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)