fruitpicker01 commited on
Commit
0062f1c
·
verified ·
1 Parent(s): 07c5cb4

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +27 -16
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
- tokens = re.split(r'[,\s;:\(\)"«»–—]+', sentence)
 
 
1582
 
1583
  chain = []
1584
  count = 0
1585
- for t in tokens:
1586
- w = t.strip()
1587
- if not w:
 
 
 
1588
  continue
1589
- parsed = morph.parse(w)[0]
1590
- if 'NOUN' in parsed.tag:
 
 
1591
  count += 1
1592
- chain.append(parsed.normal_form)
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 (False, f"Несколько существительных подряд: {chain_tuple}")
 
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