pyannotators-entityfishing 1.6.136__tar.gz → 1.6.140__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/PKG-INFO +1 -1
  2. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/src/pyannotators_entityfishing/__init__.py +1 -1
  3. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/tools/build_poi.py +45 -6
  4. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/.claude/skills/ef-mapping/SKILL.md +0 -0
  5. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/.gitignore +0 -0
  6. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/.gitmodules +0 -0
  7. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/.python-version +0 -0
  8. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/LICENSE +0 -0
  9. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/README.md +0 -0
  10. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/Taskfile.yml +0 -0
  11. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/pyproject.toml +0 -0
  12. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/src/pyannotators_entityfishing/candidates.py +0 -0
  13. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/src/pyannotators_entityfishing/ef_client.py +0 -0
  14. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/src/pyannotators_entityfishing/entityfishing.py +0 -0
  15. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/.claude-plugin/marketplace.json +0 -0
  16. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/.claude-plugin/plugin.json +0 -0
  17. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/HOWTO.md +0 -0
  18. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/README.md +0 -0
  19. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/resources/Stages.yml +0 -0
  20. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/resources/Taskfile.yml +0 -0
  21. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/resources/help/help_examples.py +0 -0
  22. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/resources/help/plugin-help.py +0 -0
  23. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/resources/help/template.en.md +0 -0
  24. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/resources/help/template.fr.md +0 -0
  25. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/skills/new-plugin/SKILL.md +0 -0
  26. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/skills/new-plugin/references/annotator.md +0 -0
  27. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/skills/new-plugin/references/converter.md +0 -0
  28. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/skills/new-plugin/references/formatter.md +0 -0
  29. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/skills/new-plugin/references/importer.md +0 -0
  30. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/skills/new-plugin/references/processor.md +0 -0
  31. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/skills/new-plugin/references/segmenter.md +0 -0
  32. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/skills/new-plugin/references/types.md +0 -0
  33. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/skills/plugin-help/SKILL.md +0 -0
  34. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/tools/check-marketplace.py +0 -0
  35. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/submodules/python-archetype/vars/pythonPipeline.groovy +0 -0
  36. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/tools/build_poi_lexicons.py +0 -0
  37. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/tools/build_rerank_data.py +0 -0
  38. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/tools/check_rerank_endpoint.py +0 -0
  39. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/tools/el_jev.py +0 -0
  40. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/tools/eval_linking.py +0 -0
  41. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/tools/eval_mappings.py +0 -0
  42. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/tools/eval_rerank.py +0 -0
  43. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/tools/finetune_rerank.py +0 -0
  44. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/tools/merge_rerank.py +0 -0
  45. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/tools/poi_common_words.json +0 -0
  46. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/tools/recalibrate_linking.py +0 -0
  47. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/tools/review_linking.html +0 -0
  48. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/tools/review_linking.py +0 -0
  49. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/tools/sherpa_plan_project.py +0 -0
  50. {pyannotators_entityfishing-1.6.136 → pyannotators_entityfishing-1.6.140}/tools/wdfilter.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pyannotators-entityfishing
3
- Version: 1.6.136
3
+ Version: 1.6.140
4
4
  Summary: Annotator based on entity-fishing
5
5
  Project-URL: Homepage, https://github.com/oterrier/pyannotators_entityfishing/
6
6
  Author-email: Olivier Terrier <olivier.terrier@kairntech.com>
@@ -1,3 +1,3 @@
1
1
  """Annotator based on entity-fishing"""
2
2
 
3
- __version__ = "1.6.136"
3
+ __version__ = "1.6.140"
@@ -7,6 +7,7 @@
7
7
  A POI is a building, monument, venue, transport hub, museum, park, square or cemetery.
8
8
  The mapping is a list of Wikidata classes, gathered from the subclass trees of hub classes,
9
9
  minus the natural places (continents, bodies of water, landforms: the AFP does not want them)
10
+ but the mountains, lakes, forests, waterfalls, canyons and caves, which it wants
10
11
  and two kinds of concepts:
11
12
 
12
13
  - a settlement: a population (P1082) marks a city, a town or an island, which stay Location;
@@ -84,9 +85,24 @@ PRECISE_HUBS = {
84
85
  "Q39614": ("cemetery", 2),
85
86
  "Q200141": ("necropolis", 2),
86
87
  }
87
- # Natural places, which the AFP does not want as POI and which stay Location: every subclass of a
88
- # continent, a body of water or a landform (the Everest, the Lake Geneva), whatever hub brings it in.
88
+ # Natural places, which stay Location: every subclass of a continent, a body of water or a landform
89
+ # (the Mediterranean, the Alps, the Strait of Hormuz), whatever hub brings it in...
89
90
  NATURAL_ROOTS = {"Q5107": "continent", "Q15324": "body of water", "Q271669": "landform"}
91
+ # ...but those of these hubs, which the AFP wants as POI (answer of 2026-10-14): a place a country
92
+ # or a city holds, the Mont Ventoux, the Lake Geneva, Sherwood Forest. Walked like the broad hubs.
93
+ NATURAL_HUBS = {
94
+ "Q8502": "mountain",
95
+ "Q8072": "volcano",
96
+ "Q207326": "summit",
97
+ "Q54050": "hill",
98
+ "Q23397": "lake",
99
+ "Q131681": "reservoir",
100
+ "Q4421": "forest",
101
+ "Q34038": "waterfall",
102
+ "Q150784": "canyon",
103
+ "Q35509": "cave",
104
+ "Q11269813": "cave with prehistoric art", # not under cave: Lascaux, Chauvet
105
+ }
90
106
  # Subclasses the hubs bring in that are not points of interest, found by
91
107
  # `python tools/wdfilter.py audit tests/data_v2/POI.json`.
92
108
  EXCLUDE = {
@@ -115,6 +131,25 @@ EXCLUDE = {
115
131
  "Q666294": "list of Natural Reserves in Russia",
116
132
  "Q2501058": "Off-Off-Broadway",
117
133
  "Q7307215": "ship refit",
134
+ "Q6617796": "list of ecoregions in Nigeria",
135
+ "Q30889174": "Chongar bridges",
136
+ "Q12363245": "no English label",
137
+ # brought in by the natural hubs: man-made or managed, not places one names
138
+ "Q131596": "farm",
139
+ "Q819511": "spoil tip",
140
+ "Q1413117": "retention basin",
141
+ "Q1434085": "underground hangar",
142
+ "Q1911141": "molehill",
143
+ "Q2039061": "windbreak",
144
+ "Q2137499": "infiltration basin",
145
+ "Q2527200": "compost heap",
146
+ "Q2586008": "commercial forest",
147
+ "Q2710737": "stockpile",
148
+ "Q2843044": "tree farm",
149
+ "Q3632569": "settling basin",
150
+ "Q4086881": "bioswale",
151
+ "Q4410701": "cultivated forest",
152
+ "Q4994812": "fire-fighting pond",
118
153
  }
119
154
 
120
155
  # Gold sets, sampled on structural properties rather than on the P31 classes the
@@ -129,9 +164,9 @@ GOLD = {
129
164
  "POI_stations": ("?x wdt:P296 ?code . ?x wdt:P625 ?c .", "a station code (P296)"),
130
165
  "POI_museums": ("?x wdt:P31/wdt:P279* wd:Q33506 .", "instance of museum or a subclass"),
131
166
  "POI_parks": ("?x wdt:P31/wdt:P279* wd:Q22698 . ?x wdt:P625 ?c .", "instance of park or a subclass"),
132
- "LOC_mountains": ("?x wdt:P2660 ?prominence .", "a topographic prominence (P2660): stays Location"),
133
- "LOC_lakes": ("?x wdt:P4511 ?depth . ?x wdt:P625 ?c .", "a vertical depth (P4511) and coordinates: stays Location"),
134
- "LOC_waterfalls": ("?x wdt:P31/wdt:P279* wd:Q34038 .", "instance of waterfall or a subclass: stays Location"),
167
+ "POI_mountains": ("?x wdt:P2660 ?prominence .", "a topographic prominence (P2660)"),
168
+ "POI_lakes": ("?x wdt:P4511 ?depth . ?x wdt:P625 ?c .", "a vertical depth (P4511) and coordinates"),
169
+ "POI_waterfalls": ("?x wdt:P31/wdt:P279* wd:Q34038 .", "instance of waterfall or a subclass"),
135
170
  "POI_squares": ("?x wdt:P31/wdt:P279* wd:Q174782 .", "instance of square or a subclass"),
136
171
  "LOC_rivers": ("?x wdt:P403 ?mouth . ?x wdt:P2043 ?length .", "a watercourse with a mouth (P403): stays Location"),
137
172
  }
@@ -142,10 +177,14 @@ def poi_classes() -> list[str]:
142
177
  kept: set[str] = set()
143
178
  for hub in BROAD_HUBS:
144
179
  kept.update(n.qid for n in taxonomy(hub, max_depth=2, counts=False) if n.sites >= MIN_SITES or n.depth == 0)
180
+ wanted: set[str] = set()
181
+ for hub in NATURAL_HUBS:
182
+ wanted.update(n.qid for n in taxonomy(hub, max_depth=2, counts=False) if n.sites >= MIN_SITES or n.depth == 0)
183
+ kept |= wanted
145
184
  for hub, (_, depth) in PRECISE_HUBS.items():
146
185
  kept.update(n.qid for n in taxonomy(hub, max_depth=depth, counts=False) if n.depth <= 1 or n.sites >= MIN_SITES)
147
186
  natural = {r["c"].rsplit("/", 1)[1] for root in NATURAL_ROOTS for r in _sparql(f"SELECT ?c WHERE {{ ?c wdt:P279* wd:{root} }}", timeout=300)}
148
- return sorted(kept - EXCLUDE.keys() - natural, key=lambda q: int(q[1:]))
187
+ return sorted(kept - EXCLUDE.keys() - (natural - wanted), key=lambda q: int(q[1:]))
149
188
 
150
189
 
151
190
  def build_mapping(qids: list[str]) -> dict: