Spaces:
Running
Running
VladGeekPro commited on
Commit ·
c743599
1
Parent(s): e23c8c3
SupplierDebugging
Browse files- app.py +68 -67
- extractors/amount_extractor.py +4 -0
- extractors/date_extractor.py +10 -1
- requirements.txt +0 -2
app.py
CHANGED
|
@@ -29,7 +29,6 @@ from extractors import (
|
|
| 29 |
# HuggingFace Token (если нужен для моделей)
|
| 30 |
HF_TOKEN = os.getenv("HF_TOKEN")
|
| 31 |
|
| 32 |
-
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
|
| 33 |
_WHISPER_MODEL: Optional[Any] = None
|
| 34 |
_WHISPER_PROCESSOR: Optional[Any] = None
|
| 35 |
|
|
@@ -64,76 +63,78 @@ TEST_PHRASES = [
|
|
| 64 |
"Через 3 дня Влад был в Wellness & spa Thermal на 1200,70 лей",
|
| 65 |
"вчера Олечка заплатил в вольта 425,40 лей",
|
| 66 |
"Сегодня Олюня купил в velmart на 755,50 лей",
|
| 67 |
-
"Вчера Оля платил в vatsak 185,80 лей",
|
| 68 |
-
"Сегодня был в Vasconi на 455,30 lei",
|
| 69 |
-
"Вчера платил в Valconi 325,90 lei",
|
| 70 |
-
"Сегодня заказал в тему на 895,60 лей",
|
| 71 |
-
"Вчера купил в temix на 185,50 лей",
|
| 72 |
-
"Сегодня оплатил в телемаркет Крикова 655,80 лей",
|
| 73 |
-
"Вчера был в такуме на 425,7 лей",
|
| 74 |
-
"Сегодня купил в tagaer на 285,40 лей",
|
| 75 |
-
"Вчера оплатил в Supraten 1200,50 лень",
|
| 76 |
-
"Сегодня был в стоматологии о фамилии на 455,90 лень",
|
| 77 |
-
"Я на следующей неделе заказал в стартур билеты на 855,60 лень",
|
| 78 |
-
"Сегодня оплатил в Sankos 245,70 лей",
|
| 79 |
-
"Вчера купил в Samurai на 325,40 лей",
|
| 80 |
-
"Сегодня был в Salomer на 185,50 lei",
|
| 81 |
-
"Вчера купил vragob na 655,80 lei",
|
| 82 |
-
"Сегодня купил в primul discounter на 425,03 лей",
|
| 83 |
-
"Вчера оплатил Premier Energy 985,90 lei",
|
| 84 |
"Сегодня заказали в пицце 9 на 285,60 лей",
|
| 85 |
-
"
|
| 86 |
-
"Сегодня к
|
| 87 |
-
"
|
|
|
|
|
|
|
| 88 |
"Через 2 дня купил в Pandashop на 895,80 лей",
|
| 89 |
-
"Pazavchora był vivația i kupil na 185,30 lei",
|
| 90 |
-
"Сегодня оплатил в oldcom 655,90 лей",
|
| 91 |
-
"Вчера купил рыбу в Ocean Fish на 280 lei",
|
| 92 |
-
"Сегодня купи
|
| 93 |
-
"вчера воля купила в nanu market на 250 lei",
|
| 94 |
-
"Сегодня купил в Mozza на 380 lei",
|
| 95 |
-
"Вчера оплатил moldpressa 90 lei",
|
| 96 |
-
"Сегодня заплатил в Moldova-Presa 180 lei",
|
| 97 |
-
"Вчера платил MoldovaGaz 1250 lei",
|
| 98 |
-
"Сегодня был в modus vivendi, я ставил 420 lei",
|
| 99 |
-
"Вчера купил в Micov na 150 lei",
|
| 100 |
-
"Сегодня оплатил в метрах 890,13 лей",
|
| 101 |
-
"Вчера купил в Мерси на 210 lei",
|
| 102 |
-
"Сегодня заплатил в Megapolis 680 lei",
|
| 103 |
-
"Вчера Оля купила лекарство в Medical Market на 340 лей",
|
| 104 |
-
"Сегодня оплатил в максимум 450 lei",
|
| 105 |
-
"Вчера купил десерт в maestro delice на 120 lei",
|
| 106 |
-
"Сегодня оплатил в maestro 750 lei",
|
| 107 |
-
"вчера оля купила в local на 190 лей",
|
| 108 |
"Сегодня был в Linelo 115 и купил на 280 лей",
|
| 109 |
"Вчера купил продукты в Linel на 420,55 лей",
|
| 110 |
"Сегодня оплатил vats 320 lei",
|
| 111 |
-
"Вчера Олечка была в Kiss Beauty Salon на 450 lei",
|
| 112 |
-
"Сегодня купил кебаб в кебаб на 150 лей",
|
| 113 |
-
"Вчера Оля была в Кауфленд и потратила 890,15 лей",
|
| 114 |
-
"Сегодня купил в cat shop на 650 lei",
|
| 115 |
-
"Вчера вечером был выкатан суши на 300 восьятлей",
|
| 116 |
-
"Оля вчера заказала в Joom на 1200 lei",
|
| 117 |
-
"Сегодня купили рассаду в Ярди Маркет на 280 лей",
|
| 118 |
-
"Вчера Влад оплатил в uiti credit 950 lei",
|
| 119 |
-
"Сегодня оплатил в U.T. Credit очередной платеж 1800 лей",
|
| 120 |
-
"Вчера заказал в iherb витамина на 420 лей",
|
| 121 |
-
"На прошлой неделе покупали в Ярмареку на 950,13 лей",
|
| 122 |
-
"Оля вчера была в Хипократис и оставила 650 lei",
|
| 123 |
-
"Сегодня я купил витамины в herb на 180 лей",
|
| 124 |
-
"Вчера купил хлеб в Граньер на 70 лей",
|
| 125 |
-
"Сегодня ходил в Global Store за техникой на 2100 лей",
|
| 126 |
-
"Вчера я оплатил интернет в Giganet 450,35 лей",
|
| 127 |
-
"Сегодня Оля купила хлеб Франзелуца на 80 петлей",
|
| 128 |
-
"вчера купил рыбу в эфилете на 420 лей",
|
| 129 |
-
"На прошлой неделе заплатил в Fidesco 1300 lei",
|
| 130 |
-
"Сегодня Влад был в Феличи и купил сыр на 95 лей",
|
| 131 |
-
"Вчера вечером купили fast food на 180 lei",
|
| 132 |
-
"Олечка вчера
|
| 133 |
-
"Я сегодня утром оплатил Eurotelicom 310 lei",
|
| 134 |
-
"Вчера Владислав оплатил энергоком 560 lei",
|
| 135 |
-
"Сегодня оплатил в Елика 420 лей",
|
| 136 |
-
"На следующей неделе в субботу хочу зайти в дёйнер-кебаб",
|
| 137 |
]
|
| 138 |
|
| 139 |
|
|
@@ -443,7 +444,7 @@ def health():
|
|
| 443 |
@app.get("/test-data")
|
| 444 |
def test_data():
|
| 445 |
"""Тестирует извлечение данных из текста без использования Whisper."""
|
| 446 |
-
debug = (request.args.get("debug") or "").strip().lower() in {"1", "true", "yes"}
|
| 447 |
extractor = build_default_pipeline(suppliers=TEST_SUPPLIERS, users=TEST_USERS)
|
| 448 |
|
| 449 |
started = time.time()
|
|
|
|
| 29 |
# HuggingFace Token (если нужен для моделей)
|
| 30 |
HF_TOKEN = os.getenv("HF_TOKEN")
|
| 31 |
|
|
|
|
| 32 |
_WHISPER_MODEL: Optional[Any] = None
|
| 33 |
_WHISPER_PROCESSOR: Optional[Any] = None
|
| 34 |
|
|
|
|
| 63 |
"Через 3 дня Влад был в Wellness & spa Thermal на 1200,70 лей",
|
| 64 |
"вчера Олечка заплатил в вольта 425,40 лей",
|
| 65 |
"Сегодня Олюня купил в velmart на 755,50 лей",
|
| 66 |
+
# "Вчера Оля платил в vatsak 185,80 лей",
|
| 67 |
+
# "Сегодня был в Vasconi на 455,30 lei",
|
| 68 |
+
# "Вчера платил в Valconi 325,90 lei",
|
| 69 |
+
# "Сегодня заказал в тему на 895,60 лей",
|
| 70 |
+
# "Вчера купил в temix на 185,50 лей",
|
| 71 |
+
# "Сегодня оплатил в телемаркет Крикова 655,80 лей",
|
| 72 |
+
# "Вчера был в такуме на 425,7 лей",
|
| 73 |
+
# "Сегодня купил в tagaer на 285,40 лей",
|
| 74 |
+
# "Вчера оплатил в Supraten 1200,50 лень",
|
| 75 |
+
# "Сегодня был в стоматологии о фамилии на 455,90 лень",
|
| 76 |
+
# "Я на следующей неделе заказал в стартур билеты на 855,60 лень",
|
| 77 |
+
# "Сегодня оплатил в Sankos 245,70 лей",
|
| 78 |
+
# "Вчера купил в Samurai на 325,40 лей",
|
| 79 |
+
# "Сегодня был в Salomer на 185,50 lei",
|
| 80 |
+
# "Вчера купил vragob na 655,80 lei",
|
| 81 |
+
# "Сегодня купил в primul discounter на 425,03 лей",
|
| 82 |
+
# "Вчера оплатил Premier Energy 985,90 lei",
|
| 83 |
"Сегодня заказали в пицце 9 на 285,60 лей",
|
| 84 |
+
"Сегодня заказали в пицце 91 на 285,60 лей",
|
| 85 |
+
"Сегодня заказали в пицце 912 на 285,60 лей",
|
| 86 |
+
# "На прошлой неделе ходили в piața centrală, купили на 455,7 lei",
|
| 87 |
+
# "Сегодня купил в peon farm на 325,40 лей",
|
| 88 |
+
# "Вчера Wallach купила в Peach Girl на 755,50 лей",
|
| 89 |
"Через 2 дня купил в Pandashop на 895,80 лей",
|
| 90 |
+
# "Pazavchora był vivația i kupil na 185,30 lei",
|
| 91 |
+
# "Сегодня оплатил в oldcom 655,90 лей",
|
| 92 |
+
# "Вчера купил рыбу в Ocean Fish на 280 lei",
|
| 93 |
+
# "Сегодня купи�� в номер 1 на 420 лей",
|
| 94 |
+
# "вчера воля купила в nanu market на 250 lei",
|
| 95 |
+
# "Сегодня купил в Mozza на 380 lei",
|
| 96 |
+
# "Вчера оплатил moldpressa 90 lei",
|
| 97 |
+
# "Сегодня заплатил в Moldova-Presa 180 lei",
|
| 98 |
+
# "Вчера платил MoldovaGaz 1250 lei",
|
| 99 |
+
# "Сегодня был в modus vivendi, я ставил 420 lei",
|
| 100 |
+
# "Вчера купил в Micov na 150 lei",
|
| 101 |
+
# "Сегодня оплатил в метрах 890,13 лей",
|
| 102 |
+
# "Вчера купил в Мерси на 210 lei",
|
| 103 |
+
# "Сегодня заплатил в Megapolis 680 lei",
|
| 104 |
+
# "Вчера Оля купила лекарство в Medical Market на 340 лей",
|
| 105 |
+
# "Сегодня оплатил в максимум 450 lei",
|
| 106 |
+
# "Вчера купил десерт в maestro delice на 120 lei",
|
| 107 |
+
# "Сегодня оплатил в maestro 750 lei",
|
| 108 |
+
# "вчера оля купила в local на 190 лей",
|
| 109 |
"Сегодня был в Linelo 115 и купил на 280 лей",
|
| 110 |
"Вчера купил продукты в Linel на 420,55 лей",
|
| 111 |
"Сегодня оплатил vats 320 lei",
|
| 112 |
+
# "Вчера Олечка была в Kiss Beauty Salon на 450 lei",
|
| 113 |
+
# "Сегодня купил кебаб в кебаб на 150 лей",
|
| 114 |
+
# "Вчера Оля была в Кауфленд и потратила 890,15 лей",
|
| 115 |
+
# "Сегодня купил в cat shop на 650 lei",
|
| 116 |
+
# "Вчера вечером был выкатан суши на 300 восьятлей",
|
| 117 |
+
# "Оля вчера заказала в Joom на 1200 lei",
|
| 118 |
+
# "Сегодня купили рассаду в Ярди Маркет на 280 лей",
|
| 119 |
+
# "Вчера Влад оплатил в uiti credit 950 lei",
|
| 120 |
+
# "Сегодня оплатил в U.T. Credit очередной платеж 1800 лей",
|
| 121 |
+
# "Вчера заказал в iherb витамина на 420 лей",
|
| 122 |
+
# "На прошлой неделе покупали в Ярмареку на 950,13 лей",
|
| 123 |
+
# "Оля вчера была в Хипократис и оставила 650 lei",
|
| 124 |
+
# "Сегодня я купил витамины в herb на 180 лей",
|
| 125 |
+
# "Вчера купил хлеб в Граньер на 70 лей",
|
| 126 |
+
# "Сегодня ходил в Global Store за техникой на 2100 лей",
|
| 127 |
+
# "Вчера я оплатил интернет в Giganet 450,35 лей",
|
| 128 |
+
# "Сегодня Оля купила хлеб Франзелуца на 80 петлей",
|
| 129 |
+
# "вчера купил рыбу в эфилете на 420 лей",
|
| 130 |
+
# "На прошлой неделе заплатил в Fidesco 1300 lei",
|
| 131 |
+
# "Сегодня Влад был в Феличи и купил сыр на 95 лей",
|
| 132 |
+
# "Вчера вечером купили fast food на 180 lei",
|
| 133 |
+
# "Олечка вчера ��упила лекарство фармачия Familia на 240 лей",
|
| 134 |
+
# "Я сегодня утром оплатил Eurotelicom 310 lei",
|
| 135 |
+
# "Вчера Владислав оплатил энергоком 560 lei",
|
| 136 |
+
# "Сегодня оплатил в Елика 420 лей",
|
| 137 |
+
# "На следующей неделе в субботу хочу зайти в дёйнер-кебаб",
|
| 138 |
]
|
| 139 |
|
| 140 |
|
|
|
|
| 444 |
@app.get("/test-data")
|
| 445 |
def test_data():
|
| 446 |
"""Тестирует извлечение данных из текста без использования Whisper."""
|
| 447 |
+
debug = (request.args.get("debug") or "1").strip().lower() in {"1", "true", "yes"}
|
| 448 |
extractor = build_default_pipeline(suppliers=TEST_SUPPLIERS, users=TEST_USERS)
|
| 449 |
|
| 450 |
started = time.time()
|
extractors/amount_extractor.py
CHANGED
|
@@ -70,6 +70,8 @@ class ExpenseAmountExtractor:
|
|
| 70 |
payload = {"amount": amount, "amount_text": amount_text}
|
| 71 |
if debug:
|
| 72 |
payload["amount_debug"] = {
|
|
|
|
|
|
|
| 73 |
"date_span": list(date_span) if date_span else None,
|
| 74 |
"supplier_span": list(supplier_span) if supplier_span else None,
|
| 75 |
"candidates": candidates,
|
|
@@ -80,6 +82,8 @@ class ExpenseAmountExtractor:
|
|
| 80 |
payload = {"amount": None, "amount_text": None}
|
| 81 |
if debug:
|
| 82 |
payload["amount_debug"] = {
|
|
|
|
|
|
|
| 83 |
"date_span": list(date_span) if date_span else None,
|
| 84 |
"supplier_span": list(supplier_span) if supplier_span else None,
|
| 85 |
"candidates": candidates,
|
|
|
|
| 70 |
payload = {"amount": amount, "amount_text": amount_text}
|
| 71 |
if debug:
|
| 72 |
payload["amount_debug"] = {
|
| 73 |
+
"matched_date_phrase": matched_date_phrase,
|
| 74 |
+
"matched_supplier_phrase": matched_supplier_phrase,
|
| 75 |
"date_span": list(date_span) if date_span else None,
|
| 76 |
"supplier_span": list(supplier_span) if supplier_span else None,
|
| 77 |
"candidates": candidates,
|
|
|
|
| 82 |
payload = {"amount": None, "amount_text": None}
|
| 83 |
if debug:
|
| 84 |
payload["amount_debug"] = {
|
| 85 |
+
"matched_date_phrase": matched_date_phrase,
|
| 86 |
+
"matched_supplier_phrase": matched_supplier_phrase,
|
| 87 |
"date_span": list(date_span) if date_span else None,
|
| 88 |
"supplier_span": list(supplier_span) if supplier_span else None,
|
| 89 |
"candidates": candidates,
|
extractors/date_extractor.py
CHANGED
|
@@ -507,10 +507,18 @@ class ExpenseDateExtractor:
|
|
| 507 |
ref_date = self.to_date(reference_date or date.today().isoformat())
|
| 508 |
parsed = self.parser.parse(text=text, reference_date=ref_date)
|
| 509 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 510 |
payload = {
|
| 511 |
"date": datetime.strptime(parsed.date_iso, "%Y-%m-%d").strftime("%d.%m.%Y") if parsed else None,
|
| 512 |
"date_iso": parsed.date_iso if parsed else None,
|
| 513 |
-
"matched_date_phrase":
|
|
|
|
| 514 |
}
|
| 515 |
|
| 516 |
if debug:
|
|
@@ -518,6 +526,7 @@ class ExpenseDateExtractor:
|
|
| 518 |
"reference_date": ref_date.isoformat(),
|
| 519 |
"input_text": text,
|
| 520 |
"matched_date_phrase": payload["matched_date_phrase"],
|
|
|
|
| 521 |
"date_iso": payload["date_iso"],
|
| 522 |
}
|
| 523 |
|
|
|
|
| 507 |
ref_date = self.to_date(reference_date or date.today().isoformat())
|
| 508 |
parsed = self.parser.parse(text=text, reference_date=ref_date)
|
| 509 |
|
| 510 |
+
matched_phrase = parsed.matched_expression if parsed else None
|
| 511 |
+
matched_span = None
|
| 512 |
+
if matched_phrase:
|
| 513 |
+
idx = text.lower().find(matched_phrase.lower())
|
| 514 |
+
if idx != -1:
|
| 515 |
+
matched_span = [idx, idx + len(matched_phrase)]
|
| 516 |
+
|
| 517 |
payload = {
|
| 518 |
"date": datetime.strptime(parsed.date_iso, "%Y-%m-%d").strftime("%d.%m.%Y") if parsed else None,
|
| 519 |
"date_iso": parsed.date_iso if parsed else None,
|
| 520 |
+
"matched_date_phrase": matched_phrase,
|
| 521 |
+
"matched_date_span": matched_span,
|
| 522 |
}
|
| 523 |
|
| 524 |
if debug:
|
|
|
|
| 526 |
"reference_date": ref_date.isoformat(),
|
| 527 |
"input_text": text,
|
| 528 |
"matched_date_phrase": payload["matched_date_phrase"],
|
| 529 |
+
"matched_date_span": payload["matched_date_span"],
|
| 530 |
"date_iso": payload["date_iso"],
|
| 531 |
}
|
| 532 |
|
requirements.txt
CHANGED
|
@@ -8,6 +8,4 @@ dateparser
|
|
| 8 |
python-dateutil
|
| 9 |
iuliia
|
| 10 |
torch
|
| 11 |
-
sentence-transformers
|
| 12 |
scikit-learn
|
| 13 |
-
gliner
|
|
|
|
| 8 |
python-dateutil
|
| 9 |
iuliia
|
| 10 |
torch
|
|
|
|
| 11 |
scikit-learn
|
|
|