pandora / src /preprocess_data.py
Deployment Bot
Fix nested src directory structure causing ModuleNotFoundError
4df95ad
Raw
History Blame Contribute Delete
2.98 kB
import os
import re
import pandas as pd
import spacy
def clean_text(text):
if not isinstance(text, str):
return ""
# Remove URLs
text = re.sub(r'http\S+|www\S+|https\S+', '', text, flags=re.MULTILINE)
# Remove HTML tags
text = re.sub(r'<.*?>', '', text)
# Remove special characters and numbers (keeping only letters and spaces)
text = re.sub(r'[^A-Za-z\s]', '', text)
# Remove extra spaces
text = re.sub(r'\s+', ' ', text).strip()
return text.lower()
def preprocess_dataset(input_file, output_clean_file, output_tokens_file, nlp):
print(f"Processing {input_file}...")
df = pd.read_csv(input_file)
# Keep only required columns if they exist
cols = [c for c in df.columns if c.lower() in ['text', 'extraversion']]
df = df[cols]
# Clean text for BERT (needs raw case/punctuation sometimes, but the WBS specified raw-case variant kept for BERT)
# Wait, for BERT we usually keep punctuation. But for classical we remove it.
# Let's save a "bert_clean" (only URLs removed) and a "classical_tokens"
df['bert_text'] = df['text'].apply(lambda x: re.sub(r'http\S+|www\S+|https\S+', '', str(x), flags=re.MULTILINE).strip())
df['clean_text'] = df['text'].apply(clean_text)
# Drop rows where text is empty
df = df[df['clean_text'].str.len() > 0]
print("Tokenizing and lemmatizing...")
# Tokenize and lemmatize
tokens_list = []
for doc in nlp.pipe(df['clean_text'], batch_size=256, disable=['parser', 'ner']):
tokens = [token.lemma_ for token in doc if not token.is_stop]
tokens_list.append(" ".join(tokens))
df['lemmatized_tokens'] = tokens_list
# Save BERT version (original case, just no URLs)
bert_df = df[['bert_text', 'extraversion']] if 'extraversion' in df.columns else df[['bert_text']]
bert_df.to_csv(output_clean_file, index=False)
# Save classical tokens version
tokens_df = df[['lemmatized_tokens', 'extraversion']] if 'extraversion' in df.columns else df[['lemmatized_tokens']]
tokens_df.to_csv(output_tokens_file, index=False)
print(f"Done. Saved to {output_clean_file} and {output_tokens_file}\n")
def main():
data_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "data")
try:
nlp = spacy.load("en_core_web_sm")
except OSError:
from spacy.cli import download
download("en_core_web_sm")
nlp = spacy.load("en_core_web_sm")
for split in ['train', 'validation', 'test']:
in_file = os.path.join(data_dir, f"{split}_set.csv")
if os.path.exists(in_file):
preprocess_dataset(
in_file,
os.path.join(data_dir, f"{split}_clean.csv"),
os.path.join(data_dir, f"{split}_tokens.csv"),
nlp
)
else:
print(f"Skipping {split}, file not found.")
if __name__ == "__main__":
main()