簡體   English   中英

提高數據預處理速度 - Python 中的正則表達式

[英]Improve Data Preprocessing Speed - Regex in Python

我使用 Python 中的以下類在將字符串傳遞給機器學習分類模型以預測其情緒之前對字符串進行預處理。

我使用正則表達式進行大部分轉換以及一些庫,如表情符號和推文預處理器。 該代碼工作正常,但我認為它很慢。

您對如何提高其速度有什么建議嗎?

用法示例:

string  = "I am very happy with @easyjet #happy customer 🙂. Second sentence"
preprocessor = TextPreprocessing()
result = preprocessor.text_preprocessor(string)

結果將是:[“我對幸福的笑臉很滿意”、“第二句”、“我對幸福的笑臉第二句很滿意”]

import re
import preprocessor as p   # this is the tweet-preprocessor library
import emoji
import os
import numpy as np
import pandas as pd

class TextPreprocessing:
    def __init__(self):
        p.set_options(p.OPT.MENTION, p.OPT.URL)

    # remove punctuation
    def _punctuation(self, val):
        val = re.sub(r'[^\w\s]', ' ', val)
        val = re.sub('_', ' ', val)
        return val

    #remove white spaces
    def _whitespace(self, val):
        return " ".join(val.split())

    #remove numbers
    def _removenumbers(self, val):
        val = re.sub('[0-9]+', '', val)
        return val

    #remove unicode
    def _remove_unicode(self, val):
        val = unidecode(val).encode("ascii")
        val = str(val, "ascii")
        return val

    #split string into sentenses
    def _split_to_sentences(self, body_text):
        sentences = re.split(
            r"(?<!\w\.\w.)(?<![A-Z][a-z]\.)(?<=\.|\?)\s", body_text)
        return sentences

    # cleaning functions that combines all of the above functions
    def _clean_text(self, val):
        val = val.lower()
        val = self._removenumbers(val)
        val = p.clean(val)
        val = ' '.join(self._punctuation(emoji.demojize(val)).split())
        val = self._remove_unicode(val)
        val = self._whitespace(val)
        return val

    def text_preprocessor(self, body_text):
        body_text_df = pd.DataFrame({"body_text": body_text}, index=[1])
        sentence_split_df = body_text_df.copy()
        sentence_split_df["body_text"] = sentence_split_df["body_text"].apply(
            self._split_to_sentences)

        lst_col = "body_text"
        sentence_split_df = pd.DataFrame(
            {
                col: np.repeat(
                    sentence_split_df[col].values, sentence_split_df[lst_col].str.len(
                    )
                )
                for col in sentence_split_df.columns.drop(lst_col)
            }
        ).assign(**{lst_col: np.concatenate(sentence_split_df[lst_col].values)})[
            sentence_split_df.columns
        ]

        final_df = (
            pd.concat([sentence_split_df, body_text_df])
            .reset_index()
            .drop(columns=["index"])
        )

        final_df["body_text"] = final_df["body_text"].apply(self._clean_text)

        return final_df["body_text"]

這個問題可能與所有想要將他們的 NLP 模型投入生產的數據科學家有關。

由於我無法發表評論,我將嘗試回答您的問題(在某種程度上):

  1. 您應該闡明如何衡量執行時間的改進。 為此使用 timeit 及其重復功能:
import timeit
from functools import partial
...
if __name__ == "__main__":
    # http://25.io/toau/audio/sample.txt
    with open("sample.txt") as f:
        text = f.read()
        tp = TextPreprocessing()
        print(min(timeit.Timer(partial(tp.text_preprocessor, text)).repeat(repeat=10, number=1)))

您還可以在特定方法上使用 timeit 來檢查瓶頸。

  1. 遺憾的是,由於未定義的np.我無法運行您的代碼示例np. 在 L58 和 L64 中,所以我無法測試我的假設。 你也沒有提供樣本數據。

  2. 一些普遍的想法:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM