Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1559,48 +1559,59 @@ def check_no_time_parasites(message, exceptions=None):
|
|
1559 |
|
1560 |
def check_no_multiple_nouns(message, exceptions=None):
|
1561 |
"""
|
1562 |
-
Проверка на 3+ подряд существительных
|
|
|
1563 |
Если конкретная цепочка лемм не в exceptions['multiple_nouns'], считаем нарушением.
|
1564 |
"""
|
|
|
|
|
|
|
1565 |
if exceptions is None:
|
1566 |
exceptions = {}
|
1567 |
allowed_chains = exceptions.get("multiple_nouns", set())
|
1568 |
|
1569 |
morph = pymorphy3.MorphAnalyzer()
|
1570 |
-
|
1571 |
-
# Разбиваем текст на предложения.
|
1572 |
|
|
|
1573 |
sentences = re.split(r'[.!?]\s*|\n+', message.strip())
|
1574 |
|
1575 |
for sentence in sentences:
|
1576 |
sentence = sentence.strip()
|
1577 |
if not sentence:
|
1578 |
continue
|
1579 |
-
|
1580 |
-
#
|
1581 |
-
|
|
|
|
|
1582 |
|
1583 |
chain = []
|
1584 |
count = 0
|
1585 |
-
|
1586 |
-
|
1587 |
-
|
|
|
|
|
|
|
1588 |
continue
|
1589 |
-
|
1590 |
-
|
|
|
|
|
1591 |
count += 1
|
1592 |
-
chain.append(
|
1593 |
else:
|
1594 |
-
# как только встретили не-сущ., сбрасываем
|
1595 |
count = 0
|
1596 |
-
chain
|
1597 |
|
1598 |
-
# Если встретили 3 подряд
|
1599 |
if count > 2:
|
1600 |
chain_tuple = tuple(chain)
|
1601 |
if chain_tuple not in allowed_chains:
|
1602 |
-
return
|
|
|
1603 |
return True
|
|
|
1604 |
|
1605 |
# 17. Производные предлоги
|
1606 |
|
|
|
1559 |
|
1560 |
def check_no_multiple_nouns(message, exceptions=None):
|
1561 |
"""
|
1562 |
+
Проверка на 3+ подряд существительных в рамках одного предложения,
|
1563 |
+
учитывая, что любой знак пунктуации тоже прерывает цепочку.
|
1564 |
Если конкретная цепочка лемм не в exceptions['multiple_nouns'], считаем нарушением.
|
1565 |
"""
|
1566 |
+
import re
|
1567 |
+
import pymorphy3
|
1568 |
+
|
1569 |
if exceptions is None:
|
1570 |
exceptions = {}
|
1571 |
allowed_chains = exceptions.get("multiple_nouns", set())
|
1572 |
|
1573 |
morph = pymorphy3.MorphAnalyzer()
|
|
|
|
|
1574 |
|
1575 |
+
# 1) Разбиваем весь текст на предложения по . ! ? или переводам строк
|
1576 |
sentences = re.split(r'[.!?]\s*|\n+', message.strip())
|
1577 |
|
1578 |
for sentence in sentences:
|
1579 |
sentence = sentence.strip()
|
1580 |
if not sentence:
|
1581 |
continue
|
1582 |
+
|
1583 |
+
# 2) Внутри одного предложения извлекаем либо слово (\w+), либо "пунктуацию" ([^\w\s]+)
|
1584 |
+
# \w+ = буквенно-цифровая последовательность
|
1585 |
+
# [^\w\s]+ = "не-слово", "не-пробел" => любой набор знаков пунктуации
|
1586 |
+
tokens = re.findall(r'\w+|[^\w\s]+', sentence)
|
1587 |
|
1588 |
chain = []
|
1589 |
count = 0
|
1590 |
+
|
1591 |
+
for token in tokens:
|
1592 |
+
# 3) Если это набор пунктуации, сбрасываем цепочку
|
1593 |
+
if re.match(r'[^\w\s]+', token):
|
1594 |
+
count = 0
|
1595 |
+
chain.clear()
|
1596 |
continue
|
1597 |
+
|
1598 |
+
# Иначе это слово => проверяем, NOUN ли это
|
1599 |
+
p = morph.parse(token)[0]
|
1600 |
+
if 'NOUN' in p.tag:
|
1601 |
count += 1
|
1602 |
+
chain.append(p.normal_form)
|
1603 |
else:
|
|
|
1604 |
count = 0
|
1605 |
+
chain.clear()
|
1606 |
|
1607 |
+
# 4) Если встретили 3+ подряд
|
1608 |
if count > 2:
|
1609 |
chain_tuple = tuple(chain)
|
1610 |
if chain_tuple not in allowed_chains:
|
1611 |
+
return False, f"Несколько существительных подряд: {chain_tuple}"
|
1612 |
+
|
1613 |
return True
|
1614 |
+
|
1615 |
|
1616 |
# 17. Производные предлоги
|
1617 |
|