Автоматизированная категоризация продуктов с помощью PythonPython

Программы на Python
Anonymous
Автоматизированная категоризация продуктов с помощью Python

Сообщение Anonymous »

Я пытаюсь автоматизировать некоторые аспекты моего малого бизнеса, в основном с помощью Python.
Там, где я живу, когда продукт продается предприятию, создается стандартизированный счет в формате .xml и отправляется покупателю.
Из этих файлов я создал скрипт для извлечения нужных мне данных, затем они разделяются на столбцы и отправляются в Excel. Основные столбцы:
Извлеченные столбцы
Пример извлеченной таблицы
Наименование данных Описание Quantita UnitaMisura PrezzoUnitario PrezzoTotale
31/10/2023 L'ORTO DI ДЖЕК С.Р.Л. ПАТАТ ВИТЕЛЛОТ 5 КГ 3,55 17,75
31.10.2023 L'ORTO DI JACK S.R.L. ПАТАТ АБРУЦЦО 30 КГ 1,55 46,5
31.10.2023 L'ORTO DI JACK S.R.L. FR.BOSCO LAMPONI VASCHETTA 125 GR 2 PZ 3,55 7,1
31.10.2023 L'ORTO DI JACK S.R.L. FR.BOSCO MIRTILLI VASCHETTA 125 GR 2 PZ 3,45 6,9
31.10.2023 L'ORTO DI JACK S.R.L. FR.BOSCO MORE VASCHETTA 125 GR 2 PZ 3,85 7,7
31.10.2023 L'ORTO DI JACK S.R.L. FRAGOLE VASCHETTA 250 GR 8 PZ 2,85 22,8
31.10.2023 L'ORTO DI JACK S.R.L. КАТАЛОГНА PUNTARELLA 13 КГ 2,3 29,9
31.10.2023 L'ORTO DI JACK S.R.L. VASO DI BASILICO 4 PZ 2,48 9,92
31.10.2023 L'ORTO DI JACK S.R.L. FIORI DI ZUCCHINA VASCHETTA 15 PZ 1,95 29,25
31.10.2023 L'ORTO DI JACK S.R.L. CIPOLLE DORATE 2,73 КГ 1,75 4,78
31.10.2023 L'ORTO DI JACK S.R.L. CIPOLLE ROSSE 5 КГ 1,8 9
31.10.2023 L'ORTO DI JACK S.R.L. LIMONI NATURALE FOGLIA 1,03 КГ 3,75 3,86
31.10.2023 L'ORTO DI JACK S.R.L. LIMONI 2,04 KG 2,25 4,59
31.10.2023 L'ORTO DI JACK S.R.L. INSALATINA RUCOLA BUSTA GHIBE 5 PZ 1,79 8,95
31.10.2023 L'ORTO DI JACK S.R.L. INSALATINA MISTICANZA BUSTE TERRE 5 PZ 1,8 9
31.10.2023 L'ORTO DI JACK S.R.L. FR.BOSCO LAMPONI VASCHETTA 125 GR 2 PZ 3,55 7,1
31.10.2023 L'ORTO DI JACK S.R.L. FR.BOSCO MIRTILLI VASCHETTA 125 GR 2 PZ 3,45 6,9
31.10.2023 L'ORTO DI JACK S.R.L. FR.BOSCO MORE VASCHETTA 125 GR 2 PZ 3,85 7,7
31.10.2023 L'ORTO DI JACK S.R.L. FRAGOLE A COLLO (8X250) 1 PZ 19,5 19,5
31.10.2023 L'ORTO DI JACK S.R.L. МЕЛАНЗАН NERE 5,35 КГ 2,35 12,57
31.10.2023 L'ORTO DI JACK S.R.L. FINOCCHI 5,425 KG 2,55 13,83
31.10.2023 L'ORTO DI JACK S.R.L. КАТАЛОГНА PUNTARELLA 20,37 КГ 2,3 46,85
31.10.2023 L'ORTO DI JACK S.R.L. PATATE ROSSE 10 КГ 1,85 18,5
31.10.2023 L'ORTO DI JACK S.R.L. COSTINE NOVELLE 5,25 КГ 3,2 16,8
31.10.2023 L'ORTO DI JACK S.R.L. FIORI DI ZUCCHINA VASCHETTA 15 PZ 1,95 29,25
31.10.2023 L'ORTO DI JACK S.R.L. ФРИГИТЕЛЛИ ВЕРДИ 1,91 КГ 3,85 7,35
31.10.2023 L'ORTO DI JACK S.R.L. ROSMARINO VASCHETTA 2 PZ 2,5 5
31.10.2023 L'ORTO DI JACK S.R.L. SALVIA VASCHETTA 3 PZ 2,5 7,5
31.10.2023 L'ORTO DI JACK S.R.L. CIPOLLE DORATE 5 КГ 1,75 8,75
31.10.2023 L'ORTO DI JACK S.R.L. FR.BOSCO LAMPONI VASCHETTA 125 GR 1 PZ 3,55 3,55
31.10.2023 L'ORTO DI JACK S.R.L. PEPERONCINO RAWIT VASCHETTA 1 PZ 3,35 3,35
31.10.2023 L'ORTO DI JACK S.R.L. FR.BOSCO MIRTILLI VASCHETTA 125 GR 1 PZ 3,45 3,45
31.10.2023 L'ORTO DI JACK S.R.L. FR.BOSCO MORE VASCHETTA 125 GR 1 PZ 3,85 3,85
31.10.2023 L'ORTO DI JACK S.R.L. CATALOGNA PUNTARELLA 13,53 KG 2,3 31,12
Где Data — дата, Denominazione — имя продавца, Descrizione — описание продукта, Quantita — количество, UnitaMisura — единица измерения. измерения (обычно кг или единица измерения), PrezzoUnitario — цена за единицу товара, PrezzoTotale — общая цена, поэтому количество x PrezzoUnitario.
Формат довольно стандартный, и я могу довольно точно извлечь эту информацию. ; Теперь основная проблема в том, что в описании товара разные продавцы пишут практически все, что хотят и как им нравится, поэтому в описании товара может быть только первая часть слова, может быть, оно сокращено, может быть, написано немного неправильно, и разные другие проблемы, такие как эти. Я хотел бы создать файл «сопоставления» в Excel (или каким-либо другим способом), где у меня есть список названий всех продуктов, которые я обычно покупаю, с назначенной категорией макросов для каждого слова, например, Apple — Fruit, Banana. - Фрукты, курица, мясо, картофель, овощи и так далее (все будет на итальянском, но, чтобы было понятно, я буду объяснять на английском). Теперь, когда я покупаю какой-либо продукт, я хочу сопоставить описание продукта с моим файлом сопоставления и назначить категорию каждому продукту, чтобы я мог автоматизировать этот процесс. Я не ожидаю, что это будет работать со 100% точностью, но я бы хотел удалить большую часть работы.
Я думал о сочетании точного сопоставления текста, и если это не найдет совпадений, тогда используйте нечеткое сопоставление, но я не уверен, что это лучший способ сделать это. Также могут возникнуть проблемы, если одно слово содержится в другом, например, Applepie не является фруктом, но содержит слово Apple.
Может быть, мне следует добавить еще одно «сопоставление» с вероятностью для категории продуктов на основе имена продавцов, поскольку 80% продавцов имеют только определенное количество категорий (вряд ли продавец будет продавать фрукты, овощи, мясо, а также компьютерные детали или ручки).
Может быть, мой мыслительный процесс совершенно неверен или бесполезен, поэтому мне нужен небольшой совет, чтобы двигаться вперед.
Это то, что я сделал с Python (3.11), используя библиотеку fuzzywuzzy, но это работает, вероятно, в 30% случаев, поэтому, вероятно, это не очень хороший подход. .
def categorize_description(description, keyword_dict, threshold=80):
description = description.lower()

# Exact word boundary matching
for category, keywords in keyword_dict.items():
for keyword in keywords:
pattern = r'\b' + re.escape(keyword) + r'\b' # Using \b for word boundaries
if re.search(pattern, description):
return category, 'Parola esatta', 100, keyword # Return exact match type with 100% similarity and matched keyword

# Fuzzy matching
# Create a combined list of all keywords
all_keywords = [(keyword, category) for category, keywords in keyword_dict.items() for keyword in keywords]
# Extract the best match
best_match = process.extractOne(description, [kw[0] for kw in all_keywords], scorer=fuzz.partial_ratio)
if best_match and best_match[1] >= threshold:
matched_keyword = best_match[0]
matched_category = next(cat for kw, cat in all_keywords if kw == matched_keyword)
return matched_category, 'Parola approssimata', best_match[
1], matched_keyword # Return fuzzy match type with similarity percentage and matched keyword

return 'Sconosciuto', 'NA', 0, '' # Return no match type with 0% similarity and empty matched keyword


Подробнее здесь: https://stackoverflow.com/questions/789 ... ith-python

Вернуться в «Python»