有没有一种更快的方法可以在Python中预处理大量文本数据?

有没有一种更快的方法可以在Python中预处理大量文本数据?,python,gpgpu,sentiment-analysis,preprocessor,gpu,Python,Gpgpu,Sentiment Analysis,Preprocessor,Gpu,我正在建立情绪分析算法来预测IMDb评论的分数。我想从头开始,所以我收集了50万条评论并创建了自己的数据集 我将发送由50篇评论组成的小评论包,以便与pool一起对cleaner进行评论。它帮助我将1000条评论的运行时间从40分钟减少到11分钟。但是,我有50万条评论,我需要更快的方式来处理它们。我在想是否有可能在我的GPU GTX1060 6GB上运行它?我安装了CUDA,但找不到如何在GPU内核上运行特定的functionreview\U cleaner 基本上,我需要的是,更快地运行预处

我正在建立情绪分析算法来预测IMDb评论的分数。我想从头开始,所以我收集了50万条评论并创建了自己的数据集

我将发送由50篇评论组成的小评论包,以便与pool一起对cleaner进行评论。它帮助我将1000条评论的运行时间从40分钟减少到11分钟。但是,我有50万条评论,我需要更快的方式来处理它们。我在想是否有可能在我的GPU GTX1060 6GB上运行它?我安装了CUDA,但找不到如何在GPU内核上运行特定的functionreview\U cleaner

基本上,我需要的是,更快地运行预处理的解决方案。我搜索并尝试了许多不同的东西,但都做不到。有没有办法让它跑得更快

def filling_the_database(review_data): 
    try:
        c.executemany("""INSERT INTO preprocessed_reviews(review, review_score) VALUES (?, ?)""", review_data)
        conn.commit()
    except Error as e:
        print(e)


def get_wordnet_pos(word):
    """Map POS tag to first character lemmatize() accepts"""
    tag = nltk.pos_tag([word])[0][1][0].upper()
    tag_dict = {"J": wordnet.ADJ,
                "N": wordnet.NOUN,
                "V": wordnet.VERB,
                "R": wordnet.ADV}

    return tag_dict.get(tag, wordnet.NOUN)


def review_cleaner(review):
    lemmatizer = WordNetLemmatizer()
    new_review_data = ()
    bulk_data = []
    for each in review:
        review_temp = ''.join([i for i in each[0] if not i.isdigit()])
        review_temp = REPLACE_NO_SPACE.sub(" ", review_temp.lower())
        review_temp = nltk.word_tokenize(review_temp)
        review_temp = (lemmatizer.lemmatize(word, get_wordnet_pos(word)) for word in review_temp)
        review_temp = ' '.join([word for word in review_temp if word not in stopwords.words('english')])
        new_review_data = (review_temp, each[1])
        bulk_data.append(new_review_data)
    filling_the_database(bulk_data)


if __name__ == "__main__":
    review_data = ()
    bulk_data = []
    amount_of_reviews = 0
    previous_amount = 0
    conn = create_connection('2020-04-11')
    c = conn.cursor()
    c.execute("""CREATE TABLE IF NOT EXISTS preprocessed_reviews(review TEXT, review_score INTEGER, ID PRIMARY KEY)""")
    conn.commit()
    total_number_of_reviews = c.execute("""SELECT COUNT(*) FROM movie_reviews""")
    for each in total_number_of_reviews:
        total_number_of_reviews = each[0]
    while amount_of_reviews < total_number_of_reviews:
        review_package = []
        amount_of_reviews += 50
        data = c.execute("""SELECT * FROM movie_reviews WHERE ID BETWEEN (?) AND (?)""", (previous_amount, amount_of_reviews-1))
        conn.commit()
        previous_amount = amount_of_reviews
        for each in data:
            review_data = (each[0], each[1])
            review_package.append(review_data)
            del review_data
        bulk_data.append(review_package)
        del review_package
        print(amount_of_reviews)
    p = Pool(4)
    p.map(review_cleaner, bulk_data)
    p.close()
    print('---- %s seconds ----' % (time.time() - start_time))

我在SQLite数据库中存储了大约50万条40万条评论。一列用于审核,一列用于审核分数。在另一个表中,我以同样的方式插入预处理的评论,一列用于评论,一列用于评分。我有16 GB的RAM、Intel i7 6700HQ、SSD和GTX1060 6GB。

我脑子里闪过一些想法

从SQLite读写可能会有相当大的开销,而实际上在16GB的ram中可以容纳500k的评论。您可以通过将数据转储到表格化的csv文件中,然后使用pandas将其读入进行预处理来实现这一点。您还可以使用pandarallel来并行化工作,而不是使用pool来简化您的生活

如果SQLite不是瓶颈,那么它很可能是一个计算瓶颈,在这种情况下,我会考虑一夜之间运行该流程,或者雇佣一个具有良好cpu资源的云计算实例。在AWS上租一台16核的机器在短时间内不会太贵,这将给你理论上4倍的加速


可能是一个比在这里发帖更好的地方。因为这里没有数值计算,GPU在这里不会有用。你是如何储存评论的?你是如何阅读这些评论的?你的机器配置是什么?请相应地更新问题如果它主要做I/O,然后尝试使用更快的spacy使用threadsTry,而不是柠檬化,我建议使用词干处理,这可能会使性能降低一点,但操作要简单得多,并且会使速度大大加快。请参阅有关如何使用spacy的标记化和词干分析的指南,请注意,必须关闭spacy的解析器标志才能真正提高速度。