Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
196 changes: 98 additions & 98 deletions Cards/Fallacies/Argumentum Fallacies - Taxonomy.csv

Large diffs are not rendered by default.

52 changes: 26 additions & 26 deletions Cards/Fallacies/Argumentum Virtues - Taxonomy.csv

Large diffs are not rendered by default.

155 changes: 155 additions & 0 deletions docs/investigations/411-pt-register-sample.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
#!/usr/bin/env python3
"""
#411 PT Register Sample: gpt-5.5 modernization of 5 Fallacies records.

Sample records: PK=139, 176, 360, 459, 817
Represents Low/Medium/High severity archaisms.

Usage:
python3 411-pt-register-sample.py # dry-run
python3 411-pt-register-sample.py --apply # write CSV
"""

import csv
import json
import sys
import io
import re
import time
from collections import Counter
from openai import OpenAI

# ── Config ──────────────────────────────────────────────────────────
KEY_PATH = r"G:\Mon Drive\MyIA\Argumentum\Fallacies\Gestion\OpenAI-Key.txt"
MODEL = "gpt-5.5"
CSV_PATH = r"..\..\Cards\Fallacies\Argumentum Fallacies - Taxonomy.csv"

# Sample PKs representing the range
SAMPLE_PKS = ["139", "176", "360", "459", "817"]
PT_FIELDS = ["desc_pt", "example_pt"]

# ── Load key ────────────────────────────────────────────────────────
with open(KEY_PATH, "r", encoding="utf-8") as f:
api_key = f.read().strip()

client = OpenAI(api_key=api_key)

# ── Load CSV ────────────────────────────────────────────────────────
with open(CSV_PATH, "r", encoding="utf-8-sig") as f:
rows = list(csv.DictReader(f, delimiter=","))
fieldnames = list(rows[0].keys())

pk_index = {row["PK"]: row for row in rows}

apply_mode = "--apply" in sys.argv
print(f"Mode: {'APPLY' if apply_mode else 'DRY-RUN'} | Model: {MODEL}")
print(f"Sample PKs: {SAMPLE_PKS}")
print()

results = []
for pk in SAMPLE_PKS:
row = pk_index.get(pk)
if not row:
print(f"PK={pk}: NOT FOUND")
continue

name = row.get("nom_vulgarisé", "")
print(f"--- PK={pk} | {name} ---")

# Build the PT text to modernize
texts = {}
for field in PT_FIELDS:
val = row.get(field, "").strip()
if val:
texts[field] = val

if not texts:
print(" No PT text to process")
continue

# Show original
for field, val in texts.items():
print(f" {field} (original): {val[:150]}...")

prompt = f"""You are a professional Portuguese translator. Modernize the following Brazilian Portuguese text by replacing ALL archaic European Portuguese forms with their modern Brazilian equivalents.

Rules:
- Replace "vós" → "vocês" (or restructure naturally)
- Replace "vosso/vossa" → "seu/sua" (agreeing with the following noun gender)
- Replace archaic verb forms (dizeis, sois, sabeis, podeis, vedes, lembrais) → modern 3rd person plural
- Preserve the EXACT meaning and register of the original
- Keep the same sentence structure where possible
- Do NOT change any other words

Texts to modernize:
"""
for i, (field, val) in enumerate(texts.items(), 1):
prompt += f"\n[{i}] {val}\n"

prompt += "\nRespond in JSON:\n{\"modernized\": {"
for i, field in enumerate(texts.keys(), 1):
if i > 1:
prompt += ", "
prompt += f"\"{field}\": \"the modernized text\""
prompt += "}}"

try:
response = client.chat.completions.create(
model=MODEL,
messages=[{"role": "user", "content": prompt}],
response_format={"type": "json_object"},
temperature=0.1,
max_tokens=1000,
)
result = json.loads(response.choices[0].message.content)
modernized = result.get("modernized", {})

for field, val in texts.items():
new_val = modernized.get(field, val)
changed = new_val != val
marker = "✅ CHANGED" if changed else "⚠️ UNCHANGED"
print(f" {field} ({marker}): {new_val[:150]}...")

results.append({
"PK": pk,
"name": name,
"original": texts,
"modernized": modernized,
})

except Exception as e:
print(f" ❌ API error: {e}")
results.append({"PK": pk, "error": str(e)})

print()
time.sleep(1)

# ── Save results ───────────────────────────────────────────────────
results_path = "411-pt-register-sample-results.json"
with open(results_path, "w", encoding="utf-8") as f:
json.dump(results, f, ensure_ascii=False, indent=2)
print(f"Results saved to {results_path}")

# ── Apply if requested ─────────────────────────────────────────────
if apply_mode:
changes = 0
for r in results:
if "error" in r or "modernized" not in r:
continue
row = pk_index.get(r["PK"])
if not row:
continue
for field, new_val in r["modernized"].items():
if row.get(field, "").strip() != new_val.strip():
row[field] = new_val
changes += 1

output = io.StringIO()
writer = csv.DictWriter(output, fieldnames=fieldnames, lineterminator="\n")
writer.writeheader()
writer.writerows(rows)
with open(CSV_PATH, "w", encoding="utf-8") as f:
f.write(output.getvalue())
print(f"\nApplied {changes} changes to CSV")
else:
print("\nDry-run mode. Use --apply to write changes.")
154 changes: 154 additions & 0 deletions docs/investigations/411-pt-register-worklist.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
# #411 PT Register Worklist — Fallacies Archaisms

## Summary

| Metric | Count |
|--------|-------|
| Total Fallacies records | 1408 |
| Records with archaic PT register | **80** |
| Cells to rework | **88** (71 desc_pt + 17 example_pt) |
| Records using modern você/vocês | 1220 (reference standard) |

## Archaism Pattern Frequency

| Pattern | Records | Notes |
|---------|---------|-------|
| `vosso` | 45 | Possessive "your" (masc.) |
| `vossa` | 25 | Possessive "your" (fem.) |
| `vós` | 12 | 2nd person plural pronoun |
| `dizeis` | 2 | Archaic verb conjugation |
| `sois` | 2 | Archaic verb conjugation |
| `sabeis` | 1 | Archaic verb conjugation |
| `podeis` | 3 | Archaic verb conjugation |
| `lembrais` | 1 | Archaic verb conjugation |
| `Esqueceis` | 1 | Archaic verb conjugation |

## Modern vs Archaic Register

The dataset overwhelmingly uses **modern Brazilian Portuguese** (`você/vocês/seu/sua`):
- Modern: **1220** records
- Archaic: **80** records (5.7%)

The archaisms are remnants of European Portuguese or literal translations. The goal is to modernize these 80 records to match the register of the other 92.3%.

## Recommended Approach

**gpt-5.5 targeted pass**: For each of the 80 records, rewrite `desc_pt`/`example_pt` replacing archaic forms with modern equivalents while preserving meaning and register.

Mapping table for gpt-5.5:
- `vós` → `vocês` (or restructure to avoid direct address)
- `vosso/vossa` → `seu/sua` (or restructure)
- `vosso/vossa` before a noun → `seu/sua` + noun
- Archaic verb forms (`dizeis`, `sois`, `sabeis`, `podeis`) → modern 3rd person plural (`dizem`, `são`, `sabem`, `podem`) or `vocês` + verb

## Full Worklist

### Records by PK

| PK | Field(s) | Archaism(s) | Severity |
|----|----------|-------------|----------|
| 139 | desc_pt | Vós | Low |
| 149 | desc_pt | vossa, vós | Medium |
| 176 | desc_pt, example_pt | vosso, vossa×2, sois | High |
| 177 | example_pt | vossa | Low |
| 248 | desc_pt | vosso | Low |
| 285 | desc_pt, example_pt | vosso×2, vossa×2 | High |
| 299 | desc_pt, example_pt | vosso×2, vós | Medium |
| 315 | desc_pt | vosso | Low |
| 329 | example_pt | vosso | Low |
| 333 | desc_pt | vosso | Low |
| 344 | desc_pt | Vós | Low |
| 346 | desc_pt | Vós, vossa | Medium |
| 350 | desc_pt | Vós, vossa | Medium |
| 357 | desc_pt | Vós | Low |
| 360 | desc_pt | vosso×2 | Medium |
| 376 | desc_pt | vosso | Low |
| 420 | example_pt | vosso | Low |
| 431 | desc_pt, example_pt | Vós, vosso×2, vossa, sabeis | High |
| 432 | desc_pt | vosso, vossa | Medium |
| 435 | example_pt | vosso | Low |
| 456 | desc_pt, example_pt | vosso×2 | Medium |
| 457 | desc_pt | vosso | Low |
| 458 | desc_pt | vossa | Low |
| 459 | example_pt | lembrais, Esqueceis, dizeis | High |
| 462 | desc_pt | vosso | Low |
| 473 | desc_pt | vosso | Low |
| 488 | desc_pt | vosso×3 | Medium |
| 518 | desc_pt, example_pt | Vós×2, vosso×2 | High |
| 519 | desc_pt | Vós, vosso | Medium |
| 521 | desc_pt | vosso | Low |
| 523 | desc_pt | vosso | Low |
| 535 | desc_pt | vosso×2 | Medium |
| 536 | desc_pt | vosso | Low |
| 538 | desc_pt | vossa | Low |
| 539 | desc_pt | vosso×2, vossa | Medium |
| 540 | desc_pt | vosso, vossa | Medium |
| 541 | desc_pt | vossa×2 | Medium |
| 542 | desc_pt | vosso, vossa | Medium |
| 769 | desc_pt | Vós | Low |
| 770 | desc_pt, example_pt | Vós, Podeis | Medium |
| 786 | desc_pt | vosso | Low |
| 787 | desc_pt | Vosso | Low |
| 789 | desc_pt | vosso | Low |
| 790 | desc_pt | vosso | Low |
| 791 | desc_pt | vossa | Low |
| 792 | desc_pt | podeis | Low |
| 793 | desc_pt | podeis | Low |
| 794 | desc_pt | vosso | Low |
| 795 | desc_pt | vossa | Low |
| 796 | desc_pt | vosso | Low |
| 797 | desc_pt | vosso | Low |
| 798 | desc_pt | Vós | Low |
| 808 | desc_pt | vossa | Low |
| 817 | desc_pt | Vós, vedes, sois | High |
| 818 | desc_pt | Vós | Low |
| 825 | desc_pt | vossa | Low |
| 883 | example_pt | vosso | Low |
| 909 | desc_pt | vosso | Low |
| 916 | desc_pt | vosso | Low |
| 925 | desc_pt | vosso | Low |
| 935 | example_pt | vossa×2 | Medium |
| 958 | desc_pt | vosso, vossa | Medium |
| 959 | desc_pt | vosso | Low |
| 960 | desc_pt | vosso | Low |
| 961 | desc_pt | vosso | Low |
| 964 | desc_pt | vosso | Low |
| 973 | desc_pt | vosso | Low |
| 1012 | desc_pt | vosso | Low |
| 1040 | desc_pt | vosso, vossa | Medium |
| 1054 | desc_pt | vossa | Low |
| 1055 | desc_pt | vossa | Low |
| 1165 | desc_pt, example_pt | vosso, vós | Medium |
| 1166 | desc_pt | vossa | Low |
| 1174 | desc_pt | vosso | Low |
| 1185 | desc_pt | vossa | Low |
| 1282 | example_pt | vós | Low |
| 1298 | example_pt | Dizeis | Low |
| 1346 | desc_pt | vosso | Low |
| 1357 | desc_pt | vosso | Low |
| 1358 | desc_pt | vosso | Low |

## Severity Distribution

| Severity | Count | Description |
|----------|-------|-------------|
| Low | 52 | Single archaism, simple replacement |
| Medium | 20 | 2-3 archaisms, context-aware replacement |
| High | 8 | 4+ archaisms or archaic verb conjugations |

## Sample 5 Records for gpt-5.5 Validation

These 5 records represent the range of complexity:

1. **PK=139** (Low): `desc_pt` has single "Vós" → straightforward replacement
2. **PK=360** (Medium): `desc_pt` has "vosso" ×2 → context-aware seu/sua
3. **PK=176** (High): `desc_pt` + `example_pt` with vosso, vossa×2, sois → multiple patterns
4. **PK=459** (High): `example_pt` with lembrais, Esqueceis, dizeis → archaic verbs
5. **PK=817** (High): `desc_pt` with Vós, vedes, sois → archaic verbs

## Next Steps

1. **ai-01 review** this worklist for register alignment strategy
2. **Sample pass** (5-10 records) via gpt-5.5 → diff review by ai-01
3. **Bulk pass** (remaining 75 records) only after ai-01 ✅ on sample
4. PR separate from #432, merge-after-Thursday
62 changes: 62 additions & 0 deletions docs/investigations/411-pt-sample-results.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
[
{
"PK": "139",
"name": "",
"original": {
"desc_pt": "Vós avaliais cenários reais a partir de uma perspectiva idealizada, ignorando defeitos e motivações.",
"example_pt": "Para resolver o desemprego, não há mistério: é preciso trabalhar mais."
},
"modernized": {
"desc_pt": "Vocês avaliam cenários reais a partir de uma perspectiva idealizada, ignorando defeitos e motivações.",
"example_pt": "Para resolver o desemprego, não há mistério: é preciso trabalhar mais."
}
},
{
"PK": "176",
"name": "",
"original": {
"desc_pt": "Utilizais fórmulas sedutoras e um estilo persuasivo para convencer, sem necessariamente fundamentar o vosso discurso num raciocínio lógico.",
"example_pt": "A vossa eloquência está à altura da vossa presença: sois verdadeiramente excepcionais."
},
"modernized": {
"desc_pt": "Utilizam fórmulas sedutoras e um estilo persuasivo para convencer, sem necessariamente fundamentar o seu discurso num raciocínio lógico.",
"example_pt": "A sua eloquência está à altura da sua presença: são verdadeiramente excepcionais."
}
},
{
"PK": "360",
"name": "",
"original": {
"desc_pt": "Alternais habilmente entre o pró e o contra, confundindo o vosso auditório, que já não sabe qual é o vosso verdadeiro ponto de vista.",
"example_pt": "É importante preservar nossas tradições, mas enriquecer a nossa cultura também é crucial."
},
"modernized": {
"desc_pt": "Alternam habilmente entre o pró e o contra, confundindo o seu auditório, que já não sabe qual é o seu verdadeiro ponto de vista.",
"example_pt": "É importante preservar nossas tradições, mas enriquecer a nossa cultura também é crucial."
}
},
{
"PK": "459",
"name": "",
"original": {
"desc_pt": "Vocês manipulam conscientemente a realidade para fazer alguém duvidar das suas próprias memórias ou percepções.",
"example_pt": "Não vos lembrais de que me prometestes vir a esta reunião? Esqueceis-vos frequentemente do que dizeis, isso é preocupante. Talvez devêsseis prestar mais atenção."
},
"modernized": {
"desc_pt": "Vocês manipulam conscientemente a realidade para fazer alguém duvidar das suas próprias memórias ou percepções.",
"example_pt": "Vocês não se lembram de que me prometeram vir a esta reunião? Vocês se esquecem frequentemente do que dizem, isso é preocupante. Talvez devessem prestar mais atenção."
}
},
{
"PK": "817",
"name": "",
"original": {
"desc_pt": "Vós vedes as coisas em preto ou branco, sem nuances. Se não sois perfeitos, considerais-vos um fracasso total.",
"example_pt": "Se eu não tirei A no meu exame, então sou um completo zero nesta matéria."
},
"modernized": {
"desc_pt": "Vocês veem as coisas em preto ou branco, sem nuances. Se não são perfeitos, consideram-se um fracasso total.",
"example_pt": "Se eu não tirei A no meu exame, então sou um completo zero nesta matéria."
}
}
]
Loading
Loading