Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions codauto/codifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class Codifier(ABC):
correspondences: Dictionary mapping old codes to new codes.
train_df (pd.DataFrame): Cleaned training dataset.
test_df (pd.DataFrame): Cleaned testing dataset with hierarchical labels.
language (str): The language of your textual data.

Methods:
get_correspondences(corres_df):
Expand Down Expand Up @@ -99,9 +100,11 @@ def __init__(self,
test_df,
root_path,
corres_df=None,
min_lenght_texts=3
min_lenght_texts=3,
language='es'
):
self.root_path = root_path
self.language = language
os.makedirs(self.root_path, exist_ok=True)
self.logger = logging.getLogger(f'CNAECodifier.{id(self)}')
self.logger.setLevel(logging.INFO)
Expand Down Expand Up @@ -229,7 +232,7 @@ def clean_data(self, data_df):
data_df[col_n_0] = data_df[col_n_0].apply(
lambda n: self.get_code(str(n).replace('.', ''))
)
data_df[col_n_1] = data_df[col_n_1].apply(preprocess_text)
data_df[col_n_1] = data_df[col_n_1].apply(preprocess_text, args=(self.language,))
data_df[col_n_1] = data_df[col_n_1].apply(
lambda desc: np.nan if len(desc) <= self.min_lenght_texts else desc
)
Expand Down
2 changes: 1 addition & 1 deletion codauto/codifier_fasttext.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ def get_pred_for_batch(self, samples, idxs, clean_samples=False):
"""
if clean_samples:
samples = [
preprocess_text(sample) for sample in samples
preprocess_text(sample, self.language) for sample in samples
]

preds_raw = self.model.predict(
Expand Down
25 changes: 25 additions & 0 deletions codauto/prompt_text.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,29 @@
Texto: <includes>
"""

promt_data_de = """
Eres un experto en generación de datos de entrenamiento para modelos de clasificación.
Tu tarea es tomar una frase raíz de una actividad económica general y generar frases de entrenamiento a partir de ejemplos concretos incluidos en un texto.
Cuando corresponda, procura introducir la palabra 'otras' u 'otros' y también el uso o destino del producto.
Siempre que sea fabricación de un objeto, incluye el material con el que se hace.
Evita generar frases completamente distintas o que cambien el contexto y devuelve ÚNICAMENTE las frases sin presentaciones, comentarios, explicaciones ni frases adicionales.
Evita introducir tu output con frases como 'aquí te dejo las frases generadas' o similares.
Quiero utilizar directamente tu output así que SOLO quiero las frases.
Aquí tienes un ejemplo:
Raiz: Elaboración de productos de panadería y pastelería.
Texto: Esta clase incluye la fabricación de cualquier producto de panadería como: barras de pan, pasteles, otras harinas y pan para pienso.
Salida:
Elaboración de barras de pan.
Elaboración de pan para pienso.
roducción de productos de pasteles.
Elaboración de otras harinas.
Ahora hazlo tú con la siguiente raíz y texto:
Raiz: <title>
Texto: <includes>.

Erstelle je Klasse insgesamt genau 50 deutsche Daten. Ein drittel der erzeugten Daten pro Klasse sollen detaillierte Beschreibung aus Sicht des Gewerbetreibenden beinhalten.
Ein Beispiel: Wir sind ein Betrieb und arbeiten im Garten- und Landschaftsbau. Wir pflanzen Schnittblumen zu jeder Jahreszeit für den Verkauf an Floristen an. Beachte, was in der Klasse ein- und auschlossen ist.
Ändere nicht die Tätigkeit der vorgegebenen Klasse.
"""


24 changes: 24 additions & 0 deletions codauto/structured.py
Original file line number Diff line number Diff line change
Expand Up @@ -289,3 +289,27 @@ def get_level(self, code):
"""
code = code.replace('.', '')
return len(code)-1

class StructuredWZ(Structured):
"""
Structured hierarchy for Wirtschaftszweigklassifikation/WZ (German NACE).

Levels are determined strictly by the length of the classification code.
"""

def get_level(self, code):
"""
Compute the hierarchical level for a WZ code.

Parameters
----------
code : str
CPA classification code.

Returns
-------
int
Hierarchical level based on code length minus one.
"""
code = code.replace('.', '')
return len(code)-1
24 changes: 18 additions & 6 deletions codauto/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import matplotlib.colors as colors


def preprocess_text(input_str):
def preprocess_text(input_str, language):
"""
Cleans and normalizes the input text by:
- Converting to lowercase
Expand All @@ -23,15 +23,27 @@ def preprocess_text(input_str):

Args:
input_str (str): Input text to preprocess.
language (str) ['es', 'de']: Preprocess according to an available locale
Returns:
str: Cleaned, normalized UTF-8 string.
"""
output_str = str(input_str).lower()
output_str = output_str.replace('ñ', '__enie__')
output_str = unicodedata.normalize('NFD', output_str)
output_str = output_str.encode('ascii', 'ignore').decode('utf-8')
output_str = output_str.replace('__enie__', 'ñ')
output_str = re.sub(r'[^a-z ñ]', '', output_str)

if language == 'es':
output_str = output_str.replace('ñ', '__enie__')
output_str = unicodedata.normalize('NFD', output_str)
output_str = output_str.encode('ascii', 'ignore').decode('utf-8')
output_str = output_str.replace('__enie__', 'ñ')
output_str = re.sub(r'[^a-z ñ]', '', output_str)

if language == 'de':
output_str = output_str.replace('ä', 'ae')
output_str = output_str.replace('ö', 'oe')
output_str = output_str.replace('ü', 'ue')
output_str = output_str.replace('ß', 'ss')
output_str = unicodedata.normalize('NFD', output_str)
output_str = output_str.encode('ascii', 'ignore').decode('utf-8')

return ' '.join(output_str.split())


Expand Down
Loading