qualiwiki/wiki_compare
2025-09-03 16:04:16 +02:00
..
.gitignore recup sources 2025-09-01 18:28:23 +02:00
CHANGES.md recup sources 2025-09-01 18:28:23 +02:00
detect_suspicious_deletions.py recup sources 2025-09-01 18:28:23 +02:00
fetch_archived_proposals.py recup sources 2025-09-01 18:28:23 +02:00
fetch_osm_fr_groups.py recup sources 2025-09-01 18:28:23 +02:00
fetch_proposals.py recup sources 2025-09-01 18:28:23 +02:00
fetch_recent_changes.py recup sources 2025-09-01 18:28:23 +02:00
find_pages_unavailable_in_english.py recup sources 2025-09-01 18:28:23 +02:00
find_pages_unavailable_in_french.py recup sources 2025-09-01 18:28:23 +02:00
find_untranslated_french_pages.py recup sources 2025-09-01 18:28:23 +02:00
fix_grammar_suggestions.py recup sources 2025-09-01 18:28:23 +02:00
install_ubuntu.sh recup sources 2025-09-01 18:28:23 +02:00
post_outdated_page.py recup sources 2025-09-01 18:28:23 +02:00
propose_translation.py recup sources 2025-09-01 18:28:23 +02:00
README.md recup sources 2025-09-01 18:28:23 +02:00
suggest_grammar_improvements.py recup sources 2025-09-01 18:28:23 +02:00
suggest_translation.py recup sources 2025-09-01 18:28:23 +02:00
test_json.py recup sources 2025-09-01 18:28:23 +02:00
wiki_compare.py up wording comparaison 2025-09-03 16:04:16 +02:00
wiki_pages.csv recup sources 2025-09-01 18:28:23 +02:00

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 :

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
  2. Téléchargez le modèle "mistral:7b" :
ollama pull mistral:7b

Pour utiliser le script suggest_grammar_improvements.py, vous devez installer grammalecte :

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 :

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 :

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 :

./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 :

./post_outdated_page.py

Pour simuler la publication sans réellement poster sur Mastodon (mode test) :

./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 :

./suggest_translation.py

Pour simuler la publication sans réellement poster sur Mastodon (mode test) :

./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 :

./propose_translation.py

Pour traduire une page spécifique en utilisant sa clé :

./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. Pour télécharger le modèle "mistral:7b", exécutez :

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 :

./suggest_grammar_improvements.py

Pour vérifier une page spécifique en utilisant sa clé :

./suggest_grammar_improvements.py --page type

Note : Ce script nécessite que grammalecte soit installé. Pour l'installer, exécutez :

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 :

./detect_suspicious_deletions.py

Pour afficher les suppressions détectées sans les enregistrer dans un fichier (mode test) :

./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 :

./fetch_proposals.py

Pour forcer la mise à jour des données même si le cache est encore frais :

./fetch_proposals.py --force

Pour afficher les propositions sans les enregistrer dans un fichier (mode test) :

./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 :

./find_untranslated_french_pages.py

Pour forcer la mise à jour des données même si le cache est encore frais :

./find_untranslated_french_pages.py --force

Pour afficher les pages sans les enregistrer dans un fichier (mode test) :

./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 :

./find_pages_unavailable_in_french.py

Pour forcer la mise à jour des données même si le cache est encore frais :

./find_pages_unavailable_in_french.py --force

Pour afficher les pages sans les enregistrer dans un fichier (mode test) :

./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 :

./fetch_osm_fr_groups.py

Pour forcer la mise à jour des données même si le cache est encore frais :

./fetch_osm_fr_groups.py --force

Pour afficher les groupes sans les enregistrer dans un fichier (mode test) :

./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 :

[
  {
    "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 :

[
  {
    "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 :

{
  "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 :

{
  "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 :

{
  "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 :

{
  "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 :

{
  "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.