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

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

Сообщение Anonymous »

Я пытаюсь автоматизировать некоторые аспекты своего малого бизнеса, в основном с помощью Python.
Там, где я живу, когда продукт продается компании в стандартизированном формате .xml счет создается и отправляется покупателю.
Из этих файлов я создаю скрипт для извлечения нужных мне данных, затем они разбиваются на столбцы и отправляются в Excel. Основные столбцы:
[Extracted columns](https://i.sstatic.net/xVTY9lyi.png)
[Example of extracted table](https://i.sstatic.net/7DtIZ4eK.png)

Data Denominazione Descrizione Quantita UnitaMisura PrezzoUnitario PrezzoTotale
31/10/2023 L'ORTO DI JACK S.R.L. PATATE VITELLOTTE 5 KG 3,55 17,75
31/10/2023 L'ORTO DI JACK S.R.L. PATATE ABRUZZO 30 KG 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. CATALOGNA PUNTARELLA 13 KG 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 KG 1,75 4,78
31/10/2023 L'ORTO DI JACK S.R.L. CIPOLLE ROSSE 5 KG 1,8 9
31/10/2023 L'ORTO DI JACK S.R.L. LIMONI NATURALE FOGLIA 1,03 KG 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. MELANZANE NERE 5,35 KG 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. CATALOGNA PUNTARELLA 20,37 KG 2,3 46,85
31/10/2023 L'ORTO DI JACK S.R.L. PATATE ROSSE 10 KG 1,85 18,5
31/10/2023 L'ORTO DI JACK S.R.L. COSTINE NOVELLE 5,25 KG 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. FRIGGITELLI VERDI 1,91 KG 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 KG 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 — Фрукты, Банан - Фрукты, Курица - Мясо, Картофель - Овощи и так далее (все будет на итальянском, но чтобы было понятно, я буду объяснять на английском). Теперь, когда я покупаю какой-либо продукт, я хочу сопоставить описание продукта с моим файлом сопоставления и назначить категорию каждому продукту, чтобы можно было автоматизировать этот процесс. Я не ожидаю, что это будет работать со 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»