Skip to content

Commit 21f29ce

Browse files
Pigbibicodex
andcommitted
fix: constrain entity matching trust paths
Co-Authored-By: Codex <noreply@openai.com>
1 parent c800971 commit 21f29ce

2 files changed

Lines changed: 38 additions & 3 deletions

File tree

src/political_event_tracking_research/source_mention_extract.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,6 @@ def load_aliases(path: str | Path) -> list[MentionAlias]:
8080
symbol = row["symbol"].upper()
8181
name = row.get("name", "").strip()
8282
aliases = split_aliases(row.get("aliases", ""))
83-
if name and name.casefold() not in {alias.casefold() for alias in aliases}:
84-
aliases = (name, *aliases)
8583
if symbol not in aliases:
8684
aliases = (symbol, *aliases)
8785
records.append(MentionAlias(symbol=symbol, aliases=aliases, name=name))
@@ -145,7 +143,7 @@ def match_evidence(text: str, alias_record: MentionAlias, source_type: str = "")
145143
elif _is_generic_alias(alias_record, alias):
146144
relationship = "industry_context"
147145
else:
148-
relationship = "issuer"
146+
relationship = "unverified"
149147
matches.append((relationship, normalized_alias, is_canonical_name))
150148
if not matches:
151149
return None

tests/test_source_mention_extract.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,43 @@ def test_canonical_name_is_trusted_only_in_issuer_release(tmp_path: Path) -> Non
115115
assert by_id["official-government-policy-policy-mstr"]["entity_match_type"] == "industry_context"
116116

117117

118+
def test_curation_omission_keeps_canonical_name_as_metadata_only(tmp_path: Path) -> None:
119+
raw_items = tmp_path / "source_items.csv"
120+
raw_items.write_text(
121+
"item_id,published_at,source_type,source_url,author,text\n"
122+
"issuer,2026-04-01T00:00:00Z,issuer_release,https://example.com/release,Issuer,"
123+
'Palo Alto Networks announced a new product.\n',
124+
encoding="utf-8",
125+
)
126+
aliases = tmp_path / "aliases.csv"
127+
aliases.write_text("symbol,name,aliases\nPANW,Palo Alto Networks,PANW\n", encoding="utf-8")
128+
129+
rows = extract_source_records(raw_items, aliases, tmp_path / "events.csv")
130+
131+
assert rows == []
132+
133+
134+
def test_third_party_mentions_are_not_issuer_evidence(tmp_path: Path) -> None:
135+
raw_items = tmp_path / "source_items.csv"
136+
raw_items.write_text(
137+
"item_id,published_at,source_type,source_url,author,text\n"
138+
"policy,2026-04-01T00:00:00Z,government_policy,https://www.nist.gov/example,NIST,"
139+
'Palo Alto Networks was mentioned in general guidance.\n'
140+
"remarks,2026-04-02T00:00:00Z,official_remarks,https://www.whitehouse.gov/example,White House,"
141+
'Palo Alto Networks was mentioned in remarks.\n'
142+
"media,2026-04-03T00:00:00Z,financial_media,https://example.com/article,Media,"
143+
'Palo Alto Networks was mentioned in market coverage.\n',
144+
encoding="utf-8",
145+
)
146+
aliases = tmp_path / "aliases.csv"
147+
aliases.write_text("symbol,name,aliases\nPANW,Palo Alto Networks,Palo Alto Networks|PANW\n", encoding="utf-8")
148+
149+
rows = extract_source_records(raw_items, aliases, tmp_path / "events.csv")
150+
151+
assert len(rows) == 3
152+
assert {row["entity_match_type"] for row in rows} == {"unverified"}
153+
154+
118155
def test_direct_beneficiary_overrides_generic_alias(tmp_path: Path) -> None:
119156
raw_items = tmp_path / "source_items.csv"
120157
raw_items.write_text(

0 commit comments

Comments
 (0)