簡體   English   中英

如何加快 NLP 中停用詞去除和詞形還原的計算時間

[英]How to speed up computation time for stopword removal and lemmatization in NLP

作為文本分類模型預處理的一部分,我使用 NLTK 庫添加了停用詞刪除和詞形還原步驟。 代碼如下:

import pandas as pd
import nltk; nltk.download("all")
from nltk.corpus import stopwords; stop = set(stopwords.words('english'))
from nltk.stem import WordNetLemmatizer
from nltk.corpus import wordnet

# Stopwords removal


def remove_stopwords(entry):
  sentence_list = [word for word in entry.split() if word not in stopwords.words("english")]
  return " ".join(sentence_list)

df["Description_no_stopwords"] = df.loc[:, "Description"].apply(lambda x: remove_stopwords(x))

# Lemmatization

lemmatizer = WordNetLemmatizer()

def punct_strip(string):
  s = re.sub(r'[^\w\s]',' ',string)
  return s

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 lemmatize_rows(entry):
  sentence_list = [lemmatizer.lemmatize(word, get_wordnet_pos(word)) for word in punct_strip(entry).split()]
  return " ".join(sentence_list)

df["Description - lemmatized"] = df.loc[:, "Description_no_stopwords"].apply(lambda x: lemmatize_rows(x))

問題是,當我預處理包含 27k 個條目(我的測試集)的數據集時,移除停用詞需要 40-45 秒,而詞形還原需要同樣長的時間。 相比之下,模型評估只需要 2-3 秒。

如何重寫函數以優化計算速度? 我已經閱讀了一些關於矢量化的內容,但是示例函數比我報告的函數簡單得多,在這種情況下我不知道該怎么做。

在這里提出了一個類似的問題,並建議您嘗試緩存stopwords.words("english")對象。 在您的方法remove_stopwords您每次評估條目時都會創建對象。 所以,你絕對可以改進。 關於你的lemmatizer ,正如這里提到的,你還可以緩存你的結果以提高性能。 我可以想象你的pandas操作也相當昂貴。 您可以考慮將數據幀轉換為數組或字典,然后對其進行迭代。 如果您稍后需要一個數據框,您可以輕松地將其轉換回來。

暫無
暫無

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

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