577 lines
No EOL
18 KiB
Markdown
577 lines
No EOL
18 KiB
Markdown
# OSM Wiki Compare
|
|
|
|
Ce projet contient des scripts pour analyser les pages wiki d'OpenStreetMap, identifier celles qui ont besoin de mises à
|
|
jour ou de traductions, et publier des suggestions sur Mastodon pour encourager la communauté à contribuer.
|
|
|
|
## Vue d'ensemble
|
|
|
|
Le projet comprend onze scripts principaux :
|
|
|
|
1. **wiki_compare.py** : Récupère les 50 clés OSM les plus utilisées, compare leurs pages wiki en anglais et en
|
|
français, et identifie celles qui ont besoin de mises à jour.
|
|
2. **post_outdated_page.py** : Sélectionne aléatoirement une page wiki française qui n'est pas à jour et publie un
|
|
message sur Mastodon pour suggérer sa mise à jour.
|
|
3. **suggest_translation.py** : Identifie les pages wiki anglaises qui n'ont pas de traduction française et publie une
|
|
suggestion de traduction sur Mastodon.
|
|
4. **propose_translation.py** : Sélectionne une page wiki (par défaut la première) et utilise Ollama avec le modèle
|
|
"mistral:7b" pour proposer une traduction, qui est sauvegardée dans le fichier outdated_pages.json.
|
|
5. **suggest_grammar_improvements.py** : Sélectionne une page wiki française (par défaut la première) et utilise grammalecte
|
|
pour vérifier la grammaire et proposer des améliorations, qui sont sauvegardées dans le fichier outdated_pages.json.
|
|
6. **detect_suspicious_deletions.py** : Analyse les changements récents du wiki OSM pour détecter les suppressions
|
|
suspectes (plus de 20 caractères) et les enregistre dans un fichier JSON pour affichage sur le site web.
|
|
7. **fetch_proposals.py** : Récupère les propositions de tags OSM en cours de vote et les propositions récemment modifiées,
|
|
et les enregistre dans un fichier JSON pour affichage sur le site web. Les données sont mises en cache pendant une heure
|
|
pour éviter des requêtes trop fréquentes au serveur wiki.
|
|
8. **find_untranslated_french_pages.py** : Identifie les pages wiki françaises qui n'ont pas de traduction en anglais
|
|
et les enregistre dans un fichier JSON pour affichage sur le site web. Les données sont mises en cache pendant une heure.
|
|
9. **find_pages_unavailable_in_french.py** : Scrape la catégorie des pages non disponibles en français, gère la pagination
|
|
pour récupérer toutes les pages, les groupe par préfixe de langue et priorise les pages commençant par "En:". Les données
|
|
sont mises en cache pendant une heure.
|
|
10. **fetch_osm_fr_groups.py** : Récupère les informations sur les groupes de travail et les groupes locaux d'OSM-FR
|
|
depuis la section #Pages_des_groupes_locaux et les enregistre dans un fichier JSON pour affichage sur le site web.
|
|
Les données sont mises en cache pendant une heure.
|
|
11. **fetch_recent_changes.py** : Récupère les changements récents du wiki OSM pour l'espace de noms français, détecte les pages
|
|
nouvellement créées qui étaient auparavant dans la liste des pages non disponibles en français, et les enregistre dans un
|
|
fichier JSON pour affichage sur le site web. Les données sont mises en cache pendant une heure.
|
|
|
|
## Installation
|
|
|
|
### Prérequis
|
|
|
|
- Python 3.6 ou supérieur
|
|
- Pip (gestionnaire de paquets Python)
|
|
|
|
### Dépendances
|
|
|
|
Installez les dépendances requises :
|
|
|
|
```bash
|
|
pip install requests beautifulsoup4
|
|
```
|
|
|
|
Pour utiliser le script propose_translation.py, vous devez également installer Ollama :
|
|
|
|
1. Installez Ollama en suivant les instructions sur [ollama.ai](https://ollama.ai/)
|
|
2. Téléchargez le modèle "mistral:7b" :
|
|
|
|
```bash
|
|
ollama pull mistral:7b
|
|
```
|
|
|
|
Pour utiliser le script suggest_grammar_improvements.py, vous devez installer grammalecte :
|
|
|
|
```bash
|
|
pip install grammalecte
|
|
```
|
|
|
|
## Configuration
|
|
|
|
### Mastodon API
|
|
|
|
Pour publier sur Mastodon, vous devez :
|
|
|
|
1. Créer un compte sur une instance Mastodon
|
|
2. Créer une application dans les paramètres de votre compte pour obtenir un jeton d'accès
|
|
3. Configurer les scripts avec votre instance et votre jeton d'accès
|
|
|
|
Modifiez les constantes suivantes dans les scripts `post_outdated_page.py` et `suggest_translation.py` :
|
|
|
|
```python
|
|
MASTODON_API_URL = "https://mastodon.instance/api/v1/statuses" # Remplacez par votre instance
|
|
```
|
|
|
|
### Variables d'environnement
|
|
|
|
Définissez la variable d'environnement suivante pour l'authentification Mastodon :
|
|
|
|
```bash
|
|
export MASTODON_ACCESS_TOKEN="votre_jeton_d_acces"
|
|
```
|
|
|
|
## Utilisation
|
|
|
|
### Analyser les pages wiki
|
|
|
|
Pour analyser les pages wiki et générer les fichiers de données :
|
|
|
|
```bash
|
|
./wiki_compare.py
|
|
```
|
|
|
|
Cela produira :
|
|
|
|
- `top_keys.json` : Les 10 clés OSM les plus utilisées
|
|
- `wiki_pages.csv` : Informations sur chaque page wiki
|
|
- `outdated_pages.json` : Pages qui ont besoin de mises à jour
|
|
- Une sortie console listant les 10 pages wiki qui ont besoin de mises à jour
|
|
|
|
### Publier une suggestion de mise à jour
|
|
|
|
Pour sélectionner aléatoirement une page française qui n'est pas à jour et publier une suggestion sur Mastodon :
|
|
|
|
```bash
|
|
./post_outdated_page.py
|
|
```
|
|
|
|
Pour simuler la publication sans réellement poster sur Mastodon (mode test) :
|
|
|
|
```bash
|
|
./post_outdated_page.py --dry-run
|
|
```
|
|
|
|
### Suggérer une traduction
|
|
|
|
Pour identifier une page anglaise sans traduction française et publier une suggestion sur Mastodon :
|
|
|
|
```bash
|
|
./suggest_translation.py
|
|
```
|
|
|
|
Pour simuler la publication sans réellement poster sur Mastodon (mode test) :
|
|
|
|
```bash
|
|
./suggest_translation.py --dry-run
|
|
```
|
|
|
|
### Proposer une traduction avec Ollama
|
|
|
|
Pour sélectionner une page wiki (par défaut la première du fichier outdated_pages.json) et générer une proposition de traduction avec Ollama :
|
|
|
|
```bash
|
|
./propose_translation.py
|
|
```
|
|
|
|
Pour traduire une page spécifique en utilisant sa clé :
|
|
|
|
```bash
|
|
./propose_translation.py --page type
|
|
```
|
|
|
|
Note : Ce script nécessite que Ollama soit installé et exécuté localement avec le modèle "mistral:7b" disponible. Pour installer Ollama, suivez les instructions sur [ollama.ai](https://ollama.ai/). Pour télécharger le modèle "mistral:7b", exécutez :
|
|
|
|
```bash
|
|
ollama pull mistral:7b
|
|
```
|
|
|
|
Le script enregistre la traduction proposée dans la propriété "proposed_translation" de l'entrée correspondante dans le fichier outdated_pages.json.
|
|
|
|
### Suggérer des améliorations grammaticales avec grammalecte
|
|
|
|
Pour sélectionner une page wiki française (par défaut la première avec une version française) et générer des suggestions d'amélioration grammaticale avec grammalecte :
|
|
|
|
```bash
|
|
./suggest_grammar_improvements.py
|
|
```
|
|
|
|
Pour vérifier une page spécifique en utilisant sa clé :
|
|
|
|
```bash
|
|
./suggest_grammar_improvements.py --page type
|
|
```
|
|
|
|
Note : Ce script nécessite que grammalecte soit installé. Pour l'installer, exécutez :
|
|
|
|
```bash
|
|
pip install grammalecte
|
|
```
|
|
|
|
Le script enregistre les suggestions grammaticales dans la propriété "grammar_suggestions" de l'entrée correspondante dans le fichier outdated_pages.json. Ces suggestions sont ensuite utilisées par Symfony dans le template pour afficher des corrections possibles sur la version française de la page dans une section dédiée.
|
|
|
|
### Détecter les suppressions suspectes
|
|
|
|
Pour analyser les changements récents du wiki OSM et détecter les suppressions suspectes :
|
|
|
|
```bash
|
|
./detect_suspicious_deletions.py
|
|
```
|
|
|
|
Pour afficher les suppressions détectées sans les enregistrer dans un fichier (mode test) :
|
|
|
|
```bash
|
|
./detect_suspicious_deletions.py --dry-run
|
|
```
|
|
|
|
### Récupérer les propositions de tags
|
|
|
|
Pour récupérer les propositions de tags OSM en cours de vote et récemment modifiées :
|
|
|
|
```bash
|
|
./fetch_proposals.py
|
|
```
|
|
|
|
Pour forcer la mise à jour des données même si le cache est encore frais :
|
|
|
|
```bash
|
|
./fetch_proposals.py --force
|
|
```
|
|
|
|
Pour afficher les propositions sans les enregistrer dans un fichier (mode test) :
|
|
|
|
```bash
|
|
./fetch_proposals.py --dry-run
|
|
```
|
|
|
|
### Trouver les pages françaises sans traduction anglaise
|
|
|
|
Pour identifier les pages wiki françaises qui n'ont pas de traduction en anglais :
|
|
|
|
```bash
|
|
./find_untranslated_french_pages.py
|
|
```
|
|
|
|
Pour forcer la mise à jour des données même si le cache est encore frais :
|
|
|
|
```bash
|
|
./find_untranslated_french_pages.py --force
|
|
```
|
|
|
|
Pour afficher les pages sans les enregistrer dans un fichier (mode test) :
|
|
|
|
```bash
|
|
./find_untranslated_french_pages.py --dry-run
|
|
```
|
|
|
|
### Trouver les pages non disponibles en français
|
|
|
|
Pour identifier les pages wiki qui n'ont pas de traduction française, groupées par langue d'origine :
|
|
|
|
```bash
|
|
./find_pages_unavailable_in_french.py
|
|
```
|
|
|
|
Pour forcer la mise à jour des données même si le cache est encore frais :
|
|
|
|
```bash
|
|
./find_pages_unavailable_in_french.py --force
|
|
```
|
|
|
|
Pour afficher les pages sans les enregistrer dans un fichier (mode test) :
|
|
|
|
```bash
|
|
./find_pages_unavailable_in_french.py --dry-run
|
|
```
|
|
|
|
### Récupérer les groupes OSM-FR
|
|
|
|
Pour récupérer les informations sur les groupes de travail et les groupes locaux d'OSM-FR :
|
|
|
|
```bash
|
|
./fetch_osm_fr_groups.py
|
|
```
|
|
|
|
Pour forcer la mise à jour des données même si le cache est encore frais :
|
|
|
|
```bash
|
|
./fetch_osm_fr_groups.py --force
|
|
```
|
|
|
|
Pour afficher les groupes sans les enregistrer dans un fichier (mode test) :
|
|
|
|
```bash
|
|
./fetch_osm_fr_groups.py --dry-run
|
|
```
|
|
|
|
## Automatisation
|
|
|
|
Vous pouvez automatiser l'exécution de ces scripts à l'aide de cron pour publier régulièrement des suggestions de mises
|
|
à jour et de traductions, ainsi que pour maintenir à jour les données affichées sur le site web.
|
|
|
|
Exemple de configuration cron pour publier des suggestions et mettre à jour les données :
|
|
|
|
```
|
|
# Publier des suggestions sur Mastodon
|
|
0 10 * * 1 cd /chemin/vers/wiki_compare && ./wiki_compare.py && ./post_outdated_page.py
|
|
0 10 * * 4 cd /chemin/vers/wiki_compare && ./wiki_compare.py && ./suggest_translation.py
|
|
|
|
# Mettre à jour les données pour le site web (toutes les 6 heures)
|
|
0 */6 * * * cd /chemin/vers/wiki_compare && ./detect_suspicious_deletions.py
|
|
0 */6 * * * cd /chemin/vers/wiki_compare && ./fetch_proposals.py
|
|
0 */6 * * * cd /chemin/vers/wiki_compare && ./find_untranslated_french_pages.py
|
|
0 */6 * * * cd /chemin/vers/wiki_compare && ./find_pages_unavailable_in_french.py
|
|
0 */6 * * * cd /chemin/vers/wiki_compare && ./fetch_osm_fr_groups.py
|
|
|
|
# Récupérer les changements récents et détecter les pages nouvellement créées (toutes les heures)
|
|
0 * * * * cd /chemin/vers/wiki_compare && ./fetch_recent_changes.py
|
|
```
|
|
|
|
Note : Les scripts de mise à jour des données pour le site web intègrent déjà une vérification de fraîcheur du cache (1 heure),
|
|
mais la configuration cron ci-dessus permet de s'assurer que les données sont régulièrement mises à jour même en cas de problème
|
|
temporaire avec les scripts.
|
|
|
|
## Structure des données
|
|
|
|
### top_keys.json
|
|
|
|
Contient les 10 clés OSM les plus utilisées avec leur nombre d'utilisations :
|
|
|
|
```json
|
|
[
|
|
{
|
|
"key": "building",
|
|
"count": 459876543
|
|
}
|
|
]
|
|
```
|
|
|
|
### wiki_pages.csv
|
|
|
|
Contient des informations sur chaque page wiki :
|
|
|
|
```
|
|
key,language,url,last_modified,sections,word_count
|
|
building,en,https://wiki.openstreetmap.org/wiki/Key:building,2023-05-15,12,3500
|
|
building,fr,https://wiki.openstreetmap.org/wiki/FR:Key:building,2022-01-10,10,2800
|
|
...
|
|
```
|
|
|
|
### outdated_pages.json
|
|
|
|
Contient des informations détaillées sur les pages qui ont besoin de mises à jour :
|
|
|
|
```json
|
|
[
|
|
{
|
|
"key": "building",
|
|
"reason": "French page outdated by 491 days",
|
|
"en_page": {},
|
|
"fr_page": {},
|
|
"date_diff": 491,
|
|
"word_diff": 700,
|
|
"section_diff": 2,
|
|
"priority": 250.5,
|
|
"proposed_translation": "Texte de la traduction proposée...",
|
|
"grammar_suggestions": [
|
|
{
|
|
"paragraph": 1,
|
|
"start": 45,
|
|
"end": 52,
|
|
"type": "ACCORD",
|
|
"message": "Accord avec le nom : « bâtiments » est masculin pluriel.",
|
|
"suggestions": ["grands"],
|
|
"context": "...les grandes bâtiments de la ville..."
|
|
},
|
|
{
|
|
"paragraph": 3,
|
|
"start": 120,
|
|
"end": 128,
|
|
"type": "CONJUGAISON",
|
|
"message": "Conjugaison erronée. Accord avec « ils ».",
|
|
"suggestions": ["peuvent"],
|
|
"context": "...les bâtiments peut être classés..."
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"key": "amenity",
|
|
"reason": "French page missing",
|
|
"en_page": {},
|
|
"fr_page": null,
|
|
"date_diff": 0,
|
|
"word_diff": 4200,
|
|
"section_diff": 15,
|
|
"priority": 100
|
|
}
|
|
]
|
|
```
|
|
|
|
### suspicious_deletions.json
|
|
|
|
Contient des informations sur les suppressions suspectes détectées dans les changements récents du wiki OSM :
|
|
|
|
```json
|
|
{
|
|
"last_updated": "2025-08-22T15:03:03.616532",
|
|
"deletions": [
|
|
{
|
|
"page_title": "FR:Key:roof:shape",
|
|
"page_url": "https://wiki.openstreetmap.org/wiki/FR:Key:roof:shape",
|
|
"deletion_size": -286,
|
|
"timestamp": "22 août 2025 à 14:15",
|
|
"user": "RubenKelevra",
|
|
"comment": "Suppression de contenu obsolète"
|
|
},
|
|
{
|
|
"page_title": "FR:Key:sport",
|
|
"page_url": "https://wiki.openstreetmap.org/wiki/FR:Key:sport",
|
|
"deletion_size": -240,
|
|
"timestamp": "21 août 2025 à 09:30",
|
|
"user": "Computae",
|
|
"comment": "Mise à jour de la documentation"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### proposals.json
|
|
|
|
Contient des informations sur les propositions de tags OSM en cours de vote et récemment modifiées :
|
|
|
|
```json
|
|
{
|
|
"last_updated": "2025-08-22T15:09:49.905332",
|
|
"voting_proposals": [
|
|
{
|
|
"title": "Proposal:Man made=ceremonial gate",
|
|
"url": "https://wiki.openstreetmap.org/wiki/Proposal:Man_made%3Dceremonial_gate",
|
|
"status": "Voting",
|
|
"type": "voting"
|
|
},
|
|
{
|
|
"title": "Proposal:Developer",
|
|
"url": "https://wiki.openstreetmap.org/wiki/Proposal:Developer",
|
|
"status": "Voting",
|
|
"type": "voting"
|
|
}
|
|
],
|
|
"recent_proposals": [
|
|
{
|
|
"title": "Proposal:Landuse=brownfield",
|
|
"url": "https://wiki.openstreetmap.org/wiki/Proposal:Landuse=brownfield",
|
|
"last_modified": "22 août 2025 à 10:45",
|
|
"modified_by": "MapperUser",
|
|
"type": "recent"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### untranslated_french_pages.json
|
|
|
|
Contient des informations sur les pages wiki françaises qui n'ont pas de traduction en anglais :
|
|
|
|
```json
|
|
{
|
|
"last_updated": "2025-08-22T16:30:15.123456",
|
|
"untranslated_pages": [
|
|
{
|
|
"title": "FR:Key:building:colour",
|
|
"key": "Key:building:colour",
|
|
"url": "https://wiki.openstreetmap.org/wiki/FR:Key:building:colour",
|
|
"has_translation": false
|
|
},
|
|
{
|
|
"title": "FR:Tag:amenity=bicycle_repair_station",
|
|
"key": "Tag:amenity=bicycle_repair_station",
|
|
"url": "https://wiki.openstreetmap.org/wiki/FR:Tag:amenity=bicycle_repair_station",
|
|
"has_translation": false
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### pages_unavailable_in_french.json
|
|
|
|
Contient des informations sur les pages wiki qui n'ont pas de traduction française, groupées par langue d'origine :
|
|
|
|
```json
|
|
{
|
|
"last_updated": "2025-08-22T17:15:45.123456",
|
|
"grouped_pages": {
|
|
"En": [
|
|
{
|
|
"title": "En:Key:building:colour",
|
|
"url": "https://wiki.openstreetmap.org/wiki/En:Key:building:colour",
|
|
"language_prefix": "En",
|
|
"is_english": true,
|
|
"priority": 1
|
|
}
|
|
],
|
|
"De": [
|
|
{
|
|
"title": "De:Tag:highway=residential",
|
|
"url": "https://wiki.openstreetmap.org/wiki/De:Tag:highway=residential",
|
|
"language_prefix": "De",
|
|
"is_english": false,
|
|
"priority": 0
|
|
}
|
|
],
|
|
"Other": [
|
|
{
|
|
"title": "Tag:amenity=bicycle_repair_station",
|
|
"url": "https://wiki.openstreetmap.org/wiki/Tag:amenity=bicycle_repair_station",
|
|
"language_prefix": "Other",
|
|
"is_english": false,
|
|
"priority": 0
|
|
}
|
|
]
|
|
},
|
|
"all_pages": [
|
|
{
|
|
"title": "En:Key:building:colour",
|
|
"url": "https://wiki.openstreetmap.org/wiki/En:Key:building:colour",
|
|
"language_prefix": "En",
|
|
"is_english": true,
|
|
"priority": 1
|
|
},
|
|
{
|
|
"title": "De:Tag:highway=residential",
|
|
"url": "https://wiki.openstreetmap.org/wiki/De:Tag:highway=residential",
|
|
"language_prefix": "De",
|
|
"is_english": false,
|
|
"priority": 0
|
|
},
|
|
{
|
|
"title": "Tag:amenity=bicycle_repair_station",
|
|
"url": "https://wiki.openstreetmap.org/wiki/Tag:amenity=bicycle_repair_station",
|
|
"language_prefix": "Other",
|
|
"is_english": false,
|
|
"priority": 0
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### osm_fr_groups.json
|
|
|
|
Contient des informations sur les groupes de travail et les groupes locaux d'OSM-FR :
|
|
|
|
```json
|
|
{
|
|
"last_updated": "2025-08-22T16:45:30.789012",
|
|
"working_groups": [
|
|
{
|
|
"name": "Groupe Bâtiments",
|
|
"url": "https://wiki.openstreetmap.org/wiki/France/OSM-FR/Groupes_de_travail/B%C3%A2timents",
|
|
"description": "Groupe de travail sur la cartographie des bâtiments",
|
|
"category": "Cartographie",
|
|
"type": "working_group"
|
|
}
|
|
],
|
|
"local_groups": [
|
|
{
|
|
"name": "Groupe local de Paris",
|
|
"url": "https://wiki.openstreetmap.org/wiki/France/Paris",
|
|
"description": "Groupe local des contributeurs parisiens",
|
|
"type": "local_group"
|
|
}
|
|
],
|
|
"umap_url": "https://umap.openstreetmap.fr/fr/map/groupes-locaux-openstreetmap_152488"
|
|
}
|
|
```
|
|
|
|
## Dépannage
|
|
|
|
### Problèmes courants
|
|
|
|
1. **Erreur d'authentification Mastodon** : Vérifiez que la variable d'environnement `MASTODON_ACCESS_TOKEN` est
|
|
correctement définie et que le jeton est valide.
|
|
|
|
2. **Erreur de chargement des fichiers JSON** : Assurez-vous d'exécuter `wiki_compare.py` avant les autres scripts pour
|
|
générer les fichiers de données nécessaires.
|
|
|
|
3. **Aucune page à mettre à jour ou à traduire** : Il est possible que toutes les pages soient à jour ou traduites.
|
|
Essayez d'augmenter le nombre de clés analysées en modifiant la valeur `limit` dans la fonction `fetch_top_keys` de
|
|
`wiki_compare.py`.
|
|
|
|
### Journalisation
|
|
|
|
Tous les scripts utilisent le module `logging` pour enregistrer les informations d'exécution. Par défaut, les logs sont
|
|
affichés dans la console. Pour les rediriger vers un fichier, modifiez la configuration de logging dans chaque script.
|
|
|
|
## Contribution
|
|
|
|
Les contributions sont les bienvenues ! N'hésitez pas à ouvrir une issue ou une pull request pour améliorer ces scripts.
|
|
|
|
## Licence
|
|
|
|
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails. |