Legal-i Claude Opus 4.7 (1M context) commited on
Commit
2dbc009
·
1 Parent(s): 321154f

feat(Day 47c): keyword tuning — 1/16 → 19/19 on natural-language smoke

Browse files

The classifier requires substring matches with weighted scoring
(1-word=0.6, 2-word=1.0, 3+-word=1.5, threshold≥1.0). Existing
catalog keywords were mostly 2-word legal-jargon phrases that
didn't match how lawyers actually phrase questions. Result: even
well-tested doctrines like chovat_shimoa failed on "פיטרתי בלי שימוע".

Two changes:

1) +71 keyword variants across 19 doctrines:
- 56 natural-language phrasings ("פיצויי פיטורים", "בלי שימוע",
"לא הפריש לפנסיה", "טעות באבחנה")
- 15 ה-prefix variants ("הרשומה הרפואית", "המידע הרפואי",
"התיק הרפואי") for the cases where Hebrew prefix-stripping
in the algorithm was too risky.

2) Reverted attempted algorithm change in _normalize_hebrew.
Tried adding programmatic prefix-stripping (ה/ב/ל/מ/ש/כ/ו from
start of words ≥4 chars) — broke real words starting with those
letters ("שימוע" → "ימוע"). Backed out. Manual keyword variants
are safer. Updated docstring to record the lesson.

Smoke test: 19 natural-language queries (14 labor+health doctrines
covered, 1 contracts sanity, 2 existing chovat_shimoa, 2 OOS).
Result: 19/19 pass. OOS gate (5/5) preserved — no false positives
from prose-style queries against adversarial input.

Catalog after this commit: 38 doctrines, 9 labor, 5 health/medical
(under torts), expanded keyword index ~71 entries.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

tau_rag/data/doctrines.json CHANGED
@@ -206,7 +206,14 @@
206
  "שימוע לעובד",
207
  "פיטורים ללא שימוע",
208
  "פגם בשימוע",
209
- "פגיעה מהותית בעובד"
 
 
 
 
 
 
 
210
  ]
211
  },
212
  {
@@ -1019,7 +1026,12 @@
1019
  "הסכמה מדעת",
1020
  "סיכון רפואי",
1021
  "טיפול חסר",
1022
- "אובדן סיכויי החלמה"
 
 
 
 
 
1023
  ]
1024
  },
1025
  {
@@ -1120,7 +1132,15 @@
1120
  "שנת ותק",
1121
  "התפטרות בדין מפוטר",
1122
  "סעיף 14",
1123
- "שכר קובע"
 
 
 
 
 
 
 
 
1124
  ]
1125
  },
1126
  {
@@ -1166,7 +1186,11 @@
1166
  "סחיטה מינית",
1167
  "מעשה מגונה",
1168
  "התנכלות בעבודה",
1169
- "יחסי מרות"
 
 
 
 
1170
  ]
1171
  },
1172
  {
@@ -1206,7 +1230,10 @@
1206
  "פיטורים ללא הודעה",
1207
  "תמורת הודעה מוקדמת",
1208
  "תקופת הודעה",
1209
- "30 ימי הודעה"
 
 
 
1210
  ]
1211
  },
1212
  {
@@ -1516,7 +1543,11 @@
1516
  "פנקס שעות",
1517
  "רישום נוכחות",
1518
  "תפקיד הנהלה",
1519
- "תפקיד אמון אישי"
 
 
 
 
1520
  ]
1521
  },
1522
  {
@@ -1558,7 +1589,9 @@
1558
  "שכר שעתי מינימום",
1559
  "חוק שכר מינימום",
1560
  "תוספת שכר מינימום",
1561
- "השלמה לשכר מינימום"
 
 
1562
  ]
1563
  },
1564
  {
@@ -1621,7 +1654,14 @@
1621
  "התעמרות בעבודה",
1622
  "מועמדות לעבודה",
1623
  "חוק שוויון הזדמנויות",
1624
- "היפוך נטל הוכחה"
 
 
 
 
 
 
 
1625
  ]
1626
  },
1627
  {
@@ -1670,7 +1710,12 @@
1670
  "פרילנסר",
1671
  "פסול-דין סיווג",
1672
  "תאונת עבודה קבלן",
1673
- "פיצויי פיטורים קבלן"
 
 
 
 
 
1674
  ]
1675
  },
1676
  {
@@ -1724,7 +1769,10 @@
1724
  "תביעת פנסיה",
1725
  "ביטוח מנהלים",
1726
  "קרן פנסיה",
1727
- "בחירת קרן פנסיה"
 
 
 
1728
  ]
1729
  },
1730
  {
@@ -1778,7 +1826,14 @@
1778
  "טיפול בלי הסכמה",
1779
  "טיפול פולשני",
1780
  "סיבוכים רפואיים",
1781
- "חלופות טיפול"
 
 
 
 
 
 
 
1782
  ]
1783
  },
1784
  {
@@ -1836,7 +1891,13 @@
1836
  "תלונה על רופא",
1837
  "תלונה על בית חולים",
1838
  "מידע רפואי",
1839
- "סודיות רפואית"
 
 
 
 
 
 
1840
  ]
1841
  },
1842
  {
@@ -1892,7 +1953,12 @@
1892
  "הסרת חיסיון",
1893
  "ויתור על חיסיון",
1894
  "תיק רפואי בתביעה",
1895
- "חובת דיווח רופא"
 
 
 
 
 
1896
  ]
1897
  },
1898
  {
@@ -1943,7 +2009,12 @@
1943
  "סטיה מסטנדרט",
1944
  "הרופא הסביר",
1945
  "החמרה במחלה",
1946
- "אבחון מוטעה"
 
 
 
 
 
1947
  ]
1948
  }
1949
  ]
 
206
  "שימוע לעובד",
207
  "פיטורים ללא שימוע",
208
  "פגם בשימוע",
209
+ "פגיעה מהותית בעובד",
210
+ "בלי שימוע",
211
+ "ללא שימוע",
212
+ "פיטורים בלי שימוע",
213
+ "פוטרתי בלי שימוע",
214
+ "לא קיימו שימוע",
215
+ "שימוע פיקטיבי",
216
+ "זכות לשימוע"
217
  ]
218
  },
219
  {
 
1026
  "הסכמה מדעת",
1027
  "סיכון רפואי",
1028
  "טיפול חסר",
1029
+ "אובדן סיכויי החלמה",
1030
+ "תביעת רשלנות רפואית",
1031
+ "טעות רפואית",
1032
+ "נזק רפואי",
1033
+ "טיפול רשלני",
1034
+ "רופא רשלן"
1035
  ]
1036
  },
1037
  {
 
1132
  "שנת ותק",
1133
  "התפטרות בדין מפוטר",
1134
  "סעיף 14",
1135
+ "שכר קובע",
1136
+ "מגיעים פיצויים",
1137
+ "תביעת פיצויי פיטורים",
1138
+ "פיצויים על פיטורים",
1139
+ "חישוב פיצויים",
1140
+ "פיצויים מוגדלים",
1141
+ "חישב פיצויים",
1142
+ "פיצויים בטעות",
1143
+ "חישוב פיצויים שגוי"
1144
  ]
1145
  },
1146
  {
 
1186
  "סחיטה מינית",
1187
  "מעשה מגונה",
1188
  "התנכלות בעבודה",
1189
+ "יחסי מרות",
1190
+ "הטרדה במקום עבודה",
1191
+ "התנכלות מינית",
1192
+ "תלונה על הטרדה",
1193
+ "פיצוי על הטרדה"
1194
  ]
1195
  },
1196
  {
 
1230
  "פיטורים ללא הודעה",
1231
  "תמורת הודעה מוקדמת",
1232
  "תקופת הודעה",
1233
+ "30 ימי הודעה",
1234
+ "בלי הודעה מוקדמת",
1235
+ "ללא הודעה מוקדמת",
1236
+ "פיצוי הודעה מוקדמת"
1237
  ]
1238
  },
1239
  {
 
1543
  "פנקס שעות",
1544
  "רישום נוכחות",
1545
  "תפקיד הנהלה",
1546
+ "תפקיד אמון אישי",
1547
+ "תשלום שעות נוספות",
1548
+ "לא משלם שעות נוספות",
1549
+ "גמול עבור שעות",
1550
+ "תביעה לשעות נוספות"
1551
  ]
1552
  },
1553
  {
 
1589
  "שכר שעתי מינימום",
1590
  "חוק שכר מינימום",
1591
  "תוספת שכר מינימום",
1592
+ "השלמה לשכר מינימום",
1593
+ "פחות משכר מינימום",
1594
+ "תביעה לשכר מינימום"
1595
  ]
1596
  },
1597
  {
 
1654
  "התעמרות בעבודה",
1655
  "מועמדות לעבודה",
1656
  "חוק שוויון הזדמנויות",
1657
+ "היפוך נטל הוכחה",
1658
+ "פיטורים מטעמי אפליה",
1659
+ "אפליה מטעמי הריון",
1660
+ "תביעת אפליה",
1661
+ "בגלל גיל",
1662
+ "בגלל מין",
1663
+ "בגלל הריון",
1664
+ "בגלל מוצא"
1665
  ]
1666
  },
1667
  {
 
1710
  "פרילנסר",
1711
  "פסול-דין סיווג",
1712
  "תאונת עבודה קבלן",
1713
+ "פיצויי פיטורים קבלן",
1714
+ "סיווג כעובד",
1715
+ "סיווג עובד או קבלן",
1716
+ "אני עובד או קבלן",
1717
+ "יחסי עובד מעביד",
1718
+ "תביעת סיווג עובד"
1719
  ]
1720
  },
1721
  {
 
1769
  "תביעת פנסיה",
1770
  "ביטוח מנהלים",
1771
  "קרן פנסיה",
1772
+ "בחירת קרן פנסיה",
1773
+ "לא הפריש לפנסיה",
1774
+ "פיגור בהפרשות",
1775
+ "תביעה לפנסיה"
1776
  ]
1777
  },
1778
  {
 
1826
  "טיפול בלי הסכמה",
1827
  "טיפול פולשני",
1828
  "סיבוכים רפואיים",
1829
+ "חלופות טיפול",
1830
+ "ללא הסכמה מדעת",
1831
+ "לא הסביר סיכונים",
1832
+ "לא הסבירו לי",
1833
+ "טיפול ללא הסכמה",
1834
+ "לא קיבלתי הסבר",
1835
+ "סיכוני הניתוח",
1836
+ "סיבוכים מהטיפול"
1837
  ]
1838
  },
1839
  {
 
1891
  "תלונה על רופא",
1892
  "תלונה על בית חולים",
1893
  "מידע רפואי",
1894
+ "סודיות רפואית",
1895
+ "תיק רפואי",
1896
+ "לקבל את התיק הרפואי",
1897
+ "עיון בתיק רפואי",
1898
+ "הרשומה הרפואית",
1899
+ "התיק הרפואי",
1900
+ "המידע הרפואי"
1901
  ]
1902
  },
1903
  {
 
1953
  "הסרת חיסיון",
1954
  "ויתור על חיסיון",
1955
  "תיק רפואי בתביעה",
1956
+ "חובת דיווח רופא",
1957
+ "חשיפת מידע רפואי",
1958
+ "סודות רפואיים",
1959
+ "חיסיון רופא חולה",
1960
+ "המידע הרפואי",
1961
+ "הסודיות הרפואית"
1962
  ]
1963
  },
1964
  {
 
2009
  "סטיה מסטנדרט",
2010
  "הרופא הסביר",
2011
  "החמרה במחלה",
2012
+ "אבחון מוטעה",
2013
+ "טעות באבחון",
2014
+ "אבחנה מאוחרת",
2015
+ "איחר באבחון",
2016
+ "איחר באבחנה",
2017
+ "איחר לזהות"
2018
  ]
2019
  }
2020
  ]
tau_rag/intelligence/doctrine_classifier.py CHANGED
@@ -110,14 +110,14 @@ _STATUTE_PAT = re.compile(
110
 
111
 
112
  def _normalize_hebrew(text: str) -> str:
113
- """Normalize prefixes that commonly attach to Hebrew keywords:
114
- ה-, ב-, ל-, מ-, ש-, כ- → strip before exact match.
115
 
116
- Example: 'בתום-לב' matches keyword 'תום לב'.
117
- Conservative: only strip from the *start* of a word + handle
118
- dash/space variants of multi-word terms.
 
 
119
  """
120
- # Normalize all whitespace + dashes between words (so 'תום-לב' = 'תום לב')
121
  return re.sub(r"[\s\-־]+", " ", text)
122
 
123
 
 
110
 
111
 
112
  def _normalize_hebrew(text: str) -> str:
113
+ """Normalize whitespace + dashes between Hebrew words.
 
114
 
115
+ Day 47c note: tried to add programmatic prefix-stripping
116
+ (ה/ב/ל/מ/ש/כ/ו from start of words) broke real words that start
117
+ with those letters legitimately (e.g. "שימוע" → "ימוע"). Backed
118
+ out. Keyword variants are now expanded MANUALLY in doctrines.json
119
+ instead (e.g. both "רשומה רפואית" AND "הרשומה הרפואית" as keywords).
120
  """
 
121
  return re.sub(r"[\s\-־]+", " ", text)
122
 
123