| """Classical-strict gates (no MiniLM): block second-pass synonym drift.""" |
|
|
| from __future__ import annotations |
|
|
| from app.engine.lexical import refine_sentence |
| from app.engine.phrase import rewrite_phrases |
|
|
|
|
| SECOND_PASS = ( |
| "For the success of any business, supplying excellent customer service is " |
| "vital. Customers appreciate organizations that answer promptly to their " |
| "questions, decide issues efficiently, and treat them with respect.\n\n" |
| "Employees who communicate clearly and keep a positive attitude help create " |
| "a satisfying customer experience. Areas for improvement can be identified " |
| "by businesses that actively listen to customer feedback and consolidate " |
| "customer loyalty.\n\n" |
| "By consistently delivering high-quality service, organizations can " |
| "establish a strong reputation, gain customer retention, and spur positive " |
| "word-of-mouth recommendations." |
| ) |
|
|
|
|
| def test_phrase_blocks_found_and_present_reputation_service(): |
| source = ( |
| "By consistently delivering high-quality service, organizations can " |
| "establish a strong reputation." |
| ) |
| result = rewrite_phrases( |
| source, |
| polish=True, |
| use_t5=False, |
| max_changes=2, |
| classical_strict=True, |
| ) |
| low = result.text.lower() |
| assert "found a strong reputation" not in low |
| assert "presenting high-quality service" not in low |
| assert "launch" not in low |
| assert "prove a strong reputation" not in low |
|
|
|
|
| def test_lexical_blocks_prove_reputation_and_win_retention(): |
| source = ( |
| "Organizations can establish a strong reputation and gain customer " |
| "retention." |
| ) |
| result = refine_sentence( |
| source, |
| min_wsd=0.10, |
| polish=True, |
| classical_strict=True, |
| ) |
| low = result.text.lower() |
| assert "prove a strong reputation" not in low |
| assert "win customer retention" not in low |
|
|
|
|
| def test_lexical_blocks_resolve_to_decide_and_respond_to_answer(): |
| source = ( |
| "Customers appreciate organizations that respond promptly to their " |
| "questions, resolve issues efficiently, and treat them with respect." |
| ) |
| result = refine_sentence( |
| source, |
| min_wsd=0.10, |
| polish=True, |
| classical_strict=True, |
| ) |
| low = result.text.lower() |
| assert "decide issues" not in low |
| assert "resolve issues" in low |
| |
| assert "answer promptly to" not in low |
|
|
|
|
| def test_lexical_still_allows_maintain_to_keep_headword(): |
| source = "Employees who maintain a positive attitude help customers." |
| result = refine_sentence( |
| source, |
| min_wsd=0.10, |
| polish=True, |
| classical_strict=True, |
| ) |
| |
| low = result.text.lower() |
| assert "decide" not in low |
| assert "attitude" in low |
| if result.changes: |
| assert any( |
| c.original.lower() == "maintain" and c.replacement.lower() == "keep" |
| for c in result.changes |
| ) |
|
|
|
|
| def test_phrase_blocks_decide_determine_define_issues(): |
| source = ( |
| "Customers appreciate organizations that decide issues efficiently." |
| ) |
| result = rewrite_phrases( |
| source, |
| polish=True, |
| use_t5=False, |
| max_changes=2, |
| classical_strict=True, |
| ) |
| low = result.text.lower() |
| assert "determine issues" not in low |
| assert "define issues" not in low |
|
|
|
|
| def test_phrase_blocks_keep_to_maintain_cycle(): |
| source = "Employees who keep a positive attitude help customers." |
| result = rewrite_phrases( |
| source, |
| polish=False, |
| use_t5=False, |
| max_changes=2, |
| classical_strict=True, |
| ) |
| low = result.text.lower() |
| assert "maintain a positive attitude" not in low |
|
|
|
|
| def test_lexical_blocks_delivering_to_functioning(): |
| source = "By consistently delivering high-quality service, firms succeed." |
| result = refine_sentence( |
| source, |
| min_wsd=0.10, |
| polish=True, |
| classical_strict=True, |
| ) |
| low = result.text.lower() |
| assert "functioning" not in low |
| assert "serving high-quality service" not in low |
|
|
|
|
| def test_second_pass_sample_stays_stable_under_classical_strict(): |
| phrase = rewrite_phrases( |
| SECOND_PASS, |
| polish=True, |
| use_t5=False, |
| max_changes=2, |
| classical_strict=True, |
| ) |
| lexical = refine_sentence( |
| SECOND_PASS, |
| min_wsd=0.14, |
| polish=True, |
| classical_strict=True, |
| ) |
| combined = (phrase.text + "\n" + lexical.text).lower() |
| for bad in ( |
| "launch a strong reputation", |
| "found a strong reputation", |
| "prove a strong reputation", |
| "presenting high-quality", |
| "functioning high-quality", |
| "serving high-quality service", |
| "define issues", |
| "determine issues", |
| "maintain a positive attitude", |
| "win customer retention", |
| ): |
| assert bad not in combined |
|
|
|
|
| def test_classical_strict_skips_aggressive_ensure_path(): |
| from app.engine.lexical import ensure_wording_change |
|
|
| source = "The report assists students with useful information." |
| result = ensure_wording_change(source, classical_strict=True) |
| assert result.text == source |
| assert result.reason == "classical_strict_no_ensure" |
|
|