Исправлен .gitignore: пакет stylometry/features добавлен в репозиторий
This commit is contained in:
38
lab1/stylometry/features/characters.py
Normal file
38
lab1/stylometry/features/characters.py
Normal file
@@ -0,0 +1,38 @@
|
||||
"""Символьные признаки: частоты букв, регистр, цифры, пунктуация."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import string
|
||||
|
||||
import pandas as pd
|
||||
|
||||
from .base import safe_div
|
||||
|
||||
|
||||
def extract(row: pd.Series) -> dict[str, float]:
|
||||
text = str(row.get("text", ""))
|
||||
lower = text.lower()
|
||||
letters = [char for char in lower if "a" <= char <= "z"]
|
||||
n_letters = max(len(letters), 1)
|
||||
n_chars = max(len(text), 1)
|
||||
|
||||
features: dict[str, float] = {}
|
||||
for char in string.ascii_lowercase:
|
||||
features[f"char_freq_{char}"] = safe_div(letters.count(char), n_letters)
|
||||
|
||||
upper = sum(1 for char in text if char.isupper())
|
||||
digits = sum(1 for char in text if char.isdigit())
|
||||
spaces = sum(1 for char in text if char.isspace())
|
||||
punctuation = sum(1 for char in text if not char.isalnum() and not char.isspace())
|
||||
features.update(
|
||||
{
|
||||
"char_letter_count": float(len(letters)),
|
||||
"char_upper_rate": safe_div(upper, n_letters),
|
||||
"char_digit_rate": safe_div(digits, n_chars),
|
||||
"char_space_rate": safe_div(spaces, n_chars),
|
||||
"char_punctuation_rate": safe_div(punctuation, n_chars),
|
||||
"char_apostrophe_rate": safe_div(text.count("'"), n_chars),
|
||||
"char_quote_rate": safe_div(text.count('"'), n_chars),
|
||||
}
|
||||
)
|
||||
return features
|
||||
Reference in New Issue
Block a user