File size: 2,565 Bytes
f592f80 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | """Bounded generation recovery; raw drafts remain available for inspection."""
import copy,re
from collections import Counter
def repetition(text):
words=re.findall(r"\w+",text.casefold())
tail=words[-100:]
for n in (3,4,5,6):
grams=[tuple(tail[i:i+n]) for i in range(len(tail)-n+1)]
if grams and max(Counter(grams).values())>=4:return True
compact=re.sub(r"\s+","",text)[-240:]
return bool(re.search(r"(.{2,20})\1{5,}",compact))
def sentence_end(text):
return bool(re.search(r'[.!?。!?؟]["”’\')\]]*$',text.strip()))
def complete_prefix(text):
# Keep only complete sentences before repetitive material starts.
out=''
for m in re.finditer(r'[\s\S]*?[.!?。!?؟](?:["”’\')\]]*)(?=\s|$)',text):
candidate=text[:m.end()].strip()
if repetition(candidate):break
out=candidate
return out
def rewrite(original,generate,geometry,local,cancel,progress,max_chars=None):
attempts=[];limit=max_chars if max_chars is not None else 2*len(original)
for number in range(1):
if cancel.is_set():break
g=copy.deepcopy(geometry)
progress('Generating with requested steering settings…')
try:r=generate(g,number)
except Exception as error:
if cancel.is_set():raise InterruptedError('Stopped; completed passages saved.') from error
attempts.append({'error':str(error),'attempt':number+1});break
raw=r['text'];r['attempt']=number+1;r['effective_controls']=g['controls'] if local else None
issues=[]
if repetition(raw):issues.append('repetition')
if not sentence_end(raw):issues.append('unfinished ending')
if not raw.strip():issues.append('empty output')
if len(raw)>limit:issues.append('length limit')
r['quality_issues']=issues;attempts.append(r)
if not issues:
return {**r,'attempts':attempts,'selected_attempt':number+1,'recovery':number>0}
if cancel.is_set():break
# Never join a chopped word to the next passage. Preserve raw drafts in attempts.
for r in reversed(attempts):
prefix=complete_prefix(r.get('text','')[:limit])
if prefix:
return {**r,'text':prefix,'attempts':attempts,'selected_attempt':r['attempt'],'warning':'Only complete sentences retained; inspect raw attempts for omitted material.','recovery':True}
return {'text':original,'attempts':attempts,'original_retained':True,'error':'No complete non-repetitive draft; original retained. Raw attempts are in the report.'}
|