Source code for AuDoLab.subclasses.preprocessing
import warnings
with warnings.catch_warnings():
warnings.filterwarnings("ignore", category=DeprecationWarning)
import re
import nltk
from nltk.tokenize import RegexpTokenizer
from nltk.corpus import stopwords
from gensim.models import Phrases
from tqdm import tqdm
# Text preparation
[docs]class Preprocessor:
def __init__(self):
4 + 5
def _text_prepare(self, text, language="english", stop_words=True):
"""text preparation function for text preprocessing
Args:
text (helper variable): None
language (str, optional): Sets language of stopwords to be removed.
Defaults to "english".
stop_words (bool, optional): If true, the stopwords are removed, if
not, stopwords are left as they are. Defaults to True.
Returns:
[type]: [description]
"""
REPLACE_BY_SPACE_RE = re.compile(r"[/(){}\[\]\|@,;]")
BAD_SYMBOLS_RE = re.compile("[^0-9a-z #+_]")
NUMBERS = re.compile(r"\d+")
text = text.lower()
text = REPLACE_BY_SPACE_RE.sub(
"", text
) # replace REPLACE_BY_SPACE_RE symbols by space in text
text = BAD_SYMBOLS_RE.sub("", text)
text = NUMBERS.sub("", text)
# delete symbols which are in BAD_SYMBOLS_RE from text
words = text.split()
if stop_words:
i = 0
STOPWORDS = set(stopwords.words(language))
while i < len(words):
if words[i] in STOPWORDS:
words.pop(i)
else:
i += 1
text = " ".join(map(str, words)) # delete stopwords from text
return text
def _lemmatize_text(self, text):
"""helper function that lemmatizes already tokenized text"""
lemmatizer = nltk.stem.WordNetLemmatizer()
return " ".join([lemmatizer.lemmatize(w, "v") for w in text])
def _preprocessing(self, df, column):
"""Preprocessing function that calls the helper functions
:param df: DataFrame that has the text data stored
:type df: pd.DataFrame
:param column: column name where raw text is stored
:type column: str
:return: DataFrame with preprocessed text
:rtype: DataFrame
"""
df_temp = df.copy(deep=True)
df_temp[column] = df_temp[column].astype(str)
df_temp.loc[:, column] = [self._text_prepare(
x) for x in df_temp[column].values]
df_temp[column] = [
item for item in df_temp[column] if not item.isdigit()]
tokenizer = RegexpTokenizer(r"\w+")
df_temp["tokens"] = df_temp[column].apply(tokenizer.tokenize)
df_temp["lemma"] = df_temp["tokens"].apply(self._lemmatize_text)
df_temp["tokens"] = df_temp["lemma"].apply(tokenizer.tokenize)
return df_temp, df_temp["tokens"]
# apply prepro func
[docs] def basic_preprocessing(self, df, column, ngram_type=2):
"""The data will be lemmatized, tokenized and the stopwords will be
deleted.
Args:
df (pd.DataFrame): Dataframe where the documents to be preprocessed
are stored.
column (str): Column name of the column where docs are stored.
ngram_type (int, optional): Number of ngrams used. Defaults to 2.
Returns:
pd.DataFrame: DataFrame where the original docus and the
preprocessed documents are stored.
"""
df, df_txt = self._preprocessing(df=df, column=column)
df_txt = df_txt.reset_index()
df_txt = df_txt.drop("index", axis=1)
df_txt = df_txt["tokens"]
df = df.reset_index()
df = df.drop("index", axis=1)
if ngram_type == 2:
bigram = Phrases(df_txt, min_count=10)
for idx in tqdm(range(len(df_txt))):
for token in bigram[df_txt[idx]]:
if "_" in token:
df_txt[idx].append(token)
if ngram_type == 3:
bigram = Phrases(df_txt, min_count=10)
trigram = Phrases(bigram[df_txt])
for idx in tqdm(range(len(df_txt))):
for token in bigram[df_txt[idx]]:
if "_" in token:
df_txt[idx].append(token)
for token in trigram[df_txt[idx]]:
if "_" in token:
df_txt[idx].append(token)
if ngram_type == 4:
bigram = Phrases(df_txt, min_count=10)
trigram = Phrases(bigram[df_txt])
fourgram = Phrases(trigram[df_txt])
for idx in tqdm(range(len(df_txt))):
for token in bigram[df_txt[idx]]:
if "_" in token:
df_txt[idx].append(token)
for token in trigram[df_txt[idx]]:
if "_" in token:
df_txt[idx].append(token)
for token in fourgram[df_txt[idx]]:
if "_" in token:
df_txt[idx].append(token)
if ngram_type >= 4:
print("please specify a ngram_type <= 4")
df["preprocessed"] = df_txt
df["lemma"] = [" ".join(map(str, j)) for j in df["preprocessed"]]
df = df.drop(["tokens"], axis=1)
return df
if __name__ == "__main__":
import pandas as pd
data = pd.read_csv("mtsamples.csv")
prepro = Preprocessor()
test = prepro.basic_preprocessing(
df=data, column="transcription", ngram_type=3)