65 lines
2.5 KiB
Python
65 lines
2.5 KiB
Python
|
|
import sys
|
|||
|
|
import json
|
|||
|
|
import re
|
|||
|
|
from natasha import (
|
|||
|
|
Segmenter, MorphVocab,
|
|||
|
|
NewsEmbedding, NewsMorphTagger, NewsSyntaxParser, NewsNERTagger,
|
|||
|
|
Doc
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# Инициализация инструментов Natasha
|
|||
|
|
segmenter = Segmenter()
|
|||
|
|
morph_vocab = MorphVocab()
|
|||
|
|
emb = NewsEmbedding()
|
|||
|
|
morph_tagger = NewsMorphTagger(emb)
|
|||
|
|
syntax_parser = NewsSyntaxParser(emb)
|
|||
|
|
ner_tagger = NewsNERTagger(emb)
|
|||
|
|
|
|||
|
|
def extract_entities(text):
|
|||
|
|
doc = Doc(text)
|
|||
|
|
doc.segment(segmenter)
|
|||
|
|
doc.tag_morph(morph_tagger)
|
|||
|
|
doc.parse_syntax(syntax_parser)
|
|||
|
|
doc.tag_ner(ner_tagger)
|
|||
|
|
|
|||
|
|
entities = {
|
|||
|
|
"Истец": None,
|
|||
|
|
"Ответчик": None,
|
|||
|
|
"Дата": None,
|
|||
|
|
"Номер договора": None,
|
|||
|
|
"Сумма оплаты": None,
|
|||
|
|
"Общая стоимость": None
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Извлекаем ключевые сущности (имена, компании, даты, номера договоров)
|
|||
|
|
for span in doc.spans:
|
|||
|
|
span.normalize(morph_vocab)
|
|||
|
|
if span.type == "PER" and not entities["Истец"]:
|
|||
|
|
entities["Истец"] = span.text
|
|||
|
|
elif span.type == "ORG" and not entities["Ответчик"]:
|
|||
|
|
entities["Ответчик"] = span.text
|
|||
|
|
elif span.type == "DATE":
|
|||
|
|
entities["Дата"] = span.text
|
|||
|
|
elif span.type == "NUM" and "договор" in text.lower():
|
|||
|
|
entities["Номер договора"] = span.text
|
|||
|
|
|
|||
|
|
# Извлекаем суммы (стоимость, оплата)
|
|||
|
|
price_pattern = r"(?:стоимость|оплата|цена|сумма)\s*(?:договор[ауе]|услуг[аи]?)?\s*:?[\s]*([\d\s]+[,.]?\d*)\s*(?:руб|₽|рублей|тыс|млн)?"
|
|||
|
|
matches = re.findall(price_pattern, text, re.IGNORECASE)
|
|||
|
|
|
|||
|
|
if matches:
|
|||
|
|
# Приводим суммы к единому формату (удаляем пробелы и заменяем запятые на точки)
|
|||
|
|
prices = [re.sub(r"[^\d.]", "", match.replace(" ", "")) for match in matches]
|
|||
|
|
if len(prices) == 1:
|
|||
|
|
entities["Сумма оплаты"] = prices[0]
|
|||
|
|
elif len(prices) > 1:
|
|||
|
|
entities["Сумма оплаты"] = prices[0] # Берём первую сумму как "оплату"
|
|||
|
|
entities["Общая стоимость"] = prices[-1] # Последняя сумма — общая стоимость
|
|||
|
|
|
|||
|
|
return entities
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
text = sys.argv[1]
|
|||
|
|
extracted_entities = extract_entities(text)
|
|||
|
|
print(json.dumps(extracted_entities, ensure_ascii=False))
|