Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 29/08/2014, à 15:02

Le Goss

[Résolu] Bash: chercher mot dans un doc en ligne à partir d'un index

Bonjour à tous,

Je suis en train d'indexer les pages de ce dictionnaire, pour le consulter (sans passer d'une page à l'autre cool) via un script bash.
En voici les premières lignes dans un fichier indexdicoalexandre

α!"https://ia600301.us.archive.org/BookReader/BookReaderImages.php?zip=/18/items/dictionnairegrec00alexuoft/dictionnairegrec00alexuoft_jp2.zip&file=dictionnairegrec00alexuoft_jp2/dictionnairegrec00alexuoft_0021.jp2&scale=3&rotate=0"
αβακισκος!"https://ia600301.us.archive.org/BookReader/BookReaderImages.php?zip=/18/items/dictionnairegrec00alexuoft/dictionnairegrec00alexuoft_jp2.zip&file=dictionnairegrec00alexuoft_jp2/dictionnairegrec00alexuoft_0022.jp2&scale=3&rotate=0"
αβλακευτος!"https://ia600301.us.archive.org/BookReader/BookReaderImages.php?zip=/18/items/dictionnairegrec00alexuoft/dictionnairegrec00alexuoft_jp2.zip&file=dictionnairegrec00alexuoft_jp2/dictionnairegrec00alexuoft_0023.jp2&scale=3&rotate=0"
αβρομιτρης!"https://ia600301.us.archive.org/BookReader/BookReaderImages.php?zip=/18/items/dictionnairegrec00alexuoft/dictionnairegrec00alexuoft_jp2.zip&file=dictionnairegrec00alexuoft_jp2/dictionnairegrec00alexuoft_0024.jp2&scale=3&rotate=0"
αγαθοδαιμονεω!"https://ia600301.us.archive.org/BookReader/BookReaderImages.php?zip=/18/items/dictionnairegrec00alexuoft/dictionnairegrec00alexuoft_jp2.zip&file=dictionnairegrec00alexuoft_jp2/dictionnairegrec00alexuoft_0025.jp2&scale=3&rotate=0"
αγαθως!"https://ia600301.us.archive.org/BookReader/BookReaderImages.php?zip=/18/items/dictionnairegrec00alexuoft/dictionnairegrec00alexuoft_jp2.zip&file=dictionnairegrec00alexuoft_jp2/dictionnairegrec00alexuoft_0026.jp2&scale=3&rotate=0"
αγανοβλεφαρος!"https://ia600301.us.archive.org/BookReader/BookReaderImages.php?zip=/18/items/dictionnairegrec00alexuoft/dictionnairegrec00alexuoft_jp2.zip&file=dictionnairegrec00alexuoft_jp2/dictionnairegrec00alexuoft_0027.jp2&scale=3&rotate=0"
αγγελιαρχος!"https://ia600301.us.archive.org/BookReader/BookReaderImages.php?zip=/18/items/dictionnairegrec00alexuoft/dictionnairegrec00alexuoft_jp2.zip&file=dictionnairegrec00alexuoft_jp2/dictionnairegrec00alexuoft_0028.jp2&scale=3&rotate=0"

J'ai besoin de ce script python scriptpython.py rendu executable - merci nesthib !

#!/usr/bin/python
# coding: utf-8

import re, sys

# dictionnaire des termes à remplacer
substitutions = {}
with open('dictionnairelettres') as f:
    for line in f.readlines():
        a, b = line.decode('utf-8').split(' ', 1)
        substitutions[a] = b.strip()

# expression rationelle pour extraire les motifs entre crochets
get_bracket = re.compile('\[([^][]+)\]')

# expression rationelle pour extraire les termes à remplacer
get_letters = re.compile('\w[^\w\s]*')

# fonction de substitution des termes vers les lettres grecs
def togreek(pattern):
    return get_letters.sub(lambda m: substitutions[m.group()] if m.group() in substitutions else m.group(), pattern)

# on lit le fichier d'entrée ligne à ligne et on effectue les substitutions vers un nouveau fichier
with (open(sys.argv[1]) if len(sys.argv) > 1 else sys.stdin) as f_in, (open(sys.argv[2], 'w') if len(sys.argv) > 2 else sys.stdout) as f_out:
    for line in f_in.xreadlines():
        # on détecte les motifs entre crochets et on remplace par les lettres grecques
        transcribed = get_bracket.sub(lambda m: '%s' % togreek(m.group(1)), line.decode('utf-8'))
        # print(transcribed[:-1])
        f_out.write(transcribed.encode('utf-8'))

Puis d'un fichier dictionnairelettres que va consulter le script python - re-merci nesthib !

a α
b β
g γ
d δ
e ε
z ζ
h η
q θ
i ι
k κ
l λ
m μ
n ν
c ξ
o ο
p π
r ρ
s σ
j ς
t τ
u υ
f φ
x χ
y ψ
w ω
A Α
B Β
G Γ
D Δ
E Ε
Z Ζ
H Η
Q Θ
I Ι
K Κ
L Λ
M Μ
N Ν
C Ξ
S Ο
P Π
R Ρ
S Σ
T Τ
U Υ
F Φ
X Χ
Y Ψ
W Ω
a)\| ᾂ
h)\| ᾒ
w)\| ᾢ
a(\| ᾃ
h(\| ᾓ
w(\| ᾣ
a)/| ᾄ
h)/| ᾔ
w)/| ᾤ
a(/| ᾅ
h(/| ᾕ
w(/| ᾥ
a)=| ᾆ
h)=| ᾖ
w)=| ᾦ
a(=| ᾇ
h(=| ᾗ
w(=| ᾧ
a)\ ἂ
e)\ ἒ
h)\ ἢ
i)\ ἲ
o)\ ὂ
u)\ ὒ
w)\ ὢ
a(\ ἃ
e(\ ἓ
h(\ ἣ
i(\ ἳ
o(\ ὃ
u(\ ὓ
w(\ ὣ
a)/ ἄ
e)/ ἔ
h)/ ἤ
i)/ ἴ
o)/ ὄ
u)/ ὔ
w)/ ὤ
a(/ ἅ
e(/ ἕ
h(/ ἥ
i(/ ἵ
o(/ ὅ
u(/ ὕ
w(/ ὥ
a)| ᾀ
h)| ᾐ
w)| ᾠ
a(| ᾁ
h(| ᾑ
w(| ᾡ
a\| ᾲ
h\| ῂ
w\| ῲ
a/| ᾴ
h/| ῄ
w/| ῴ
a)= ἆ
h)= ἦ
i)= ἶ
u)= ὖ
w)= ὦ
a(= ἇ
h(= ἧ
i(= ἷ
u(= ὗ
w(= ὧ
i+\ ῒ
u+\ ῢ
i+/ ΐ
u+/ ΰ
i+= ῗ
u+= ῧ
a=| ᾷ
h=| ῇ
w=| ῷ
a) ἀ
e) ἐ
h) ἠ
i) ἰ
o) ὀ
u) ὐ
w) ὠ
r) ῤ
a( ἁ
e( ἑ
h( ἡ
i( ἱ
o( ὁ
u( ὑ
w( ὡ
r( ῥ
a\ ὰ
e\ ὲ
h\ ὴ
i\ ὶ
o\ ὸ
u\ ὺ
w\ ὼ
a/ ά
e/ έ
h/ ή
i/ ί
o/ ό
u/ ύ
w/ ώ
a| ᾳ
h| ῃ
w| ῳ
a= ᾶ
h= ῆ
i= ῖ
u= ῦ
w= ῶ
a- ᾰ
i- ῐ
u- ῠ
i+ ϊ
u+ ϋ
a_ ᾱ
i_ ῑ
u_ ῡ
v —

et enfin mon script bash qui fait tourner le tout

#!/bin/bash

vertclair='\033[0;32m'
neutre='\033[0;m'

clear
while [ -z $ouinon ] || [ $ouinon != 'o' ]
do
echo -e "Dictionnaire Grec-Français Charles ALEXANDRE\n\nLe script fait lui-même la conversion.\nCorrespondance des lettres :\n"
echo -e "αβγδεζηθικλμνξοπρσςτυφχψω  ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ"
echo -e "|||||||||||||||||||||||||  ||||||||||||||||||||||||"
echo -e "abgdezhqiklmncoprsjtufxyw  ABGDEZHQIKLMNCOPRSTUFXYW"
echo
read -p 'Mot grec recherché (exemple: agapaw pour αγαπαω) : ' recherche
sortie=`./scriptpython.py <<EOF 
[$recherche]
EOF`
echo -e "Le mot ${vertclair}$sortie${neutre} est-il le mot recherché (o/n) ?"
read -p "réponse : " ouinon
clear
done

adresse=`grep "$sortie!" indexdicoalexandre | awk -F "\"" '{printf "%s", $2}'`
firefox $adresse

Fonctionnement du script:
1. on saisit "à la française" (translittéré) les lettres grecques
2. le script renvoie la correspondance en grec et demande confirmation que c'est le bon mot recherché
3. (c'est là que je coince)...

Chaque ligne du fichier indexdicoalexandre commence par le premier mot grec de chaque page du dictionnaire.
Si je rentre ce premier mot, le script lance firefox et ouvre à la page correspondant à l'index.

Ce que cherche à faire:
- rentrer un mot qui n'est pas forcément le premier d'une page (ça c'est pas bien compliqué lol)
- demander au script de le situer alphabétiquement dans l'index et de lancer l'affichage de la page dont le premier mot est alphabétiquement le "plus près possible AU-DESSUS" du mot recherché
Pour info: j'ai fait quelques essais avec sort. La commande ordonne correctement les caractères grecs, et sans sourciller si les caractères sont accentués.

En espérant que ma façon de faire n'est pas tirée par les cheveux, et ne vous dissuadera pas d'y jeter un œil...
Merci pour votre aide,
Cordialement

Dernière modification par Le Goss (Le 29/08/2014, à 17:55)


Si je pose une question sur le forum, ce n'est pas par paresse ou pour faire faire "mes devoirs"; c'est par ignorance: j'ai 51 berges. Et, par principe, je préfère être traité d'ignare que de fainéant.
Samsung i7-3630QM CPU @ 2.40GHz × 8 - 64 bits - RAM 7,7 Gio - DD 976 Go - Bodhi 6.0.0 Ubuntu 20.04
Allergique au wysiwyg; traitement à vie: Lilypond - LaTeX - txt2tags

Hors ligne

#2 Le 29/08/2014, à 16:45

pingouinux

Re : [Résolu] Bash: chercher mot dans un doc en ligne à partir d'un index

Bonjour,
Voici une suggestion. Ce script en python3 entete_page_dico.py devrait faire le boulot

#!/usr/bin/python3

import sys

mot=sys.argv[1]
with open('indexdicoalexandre','r') as f : ligs=f.readlines()

lig_av=''; exclam_av=0
for lig in ligs :
    exclam=lig.find('!')
    mot_debut=lig[:exclam]
    if mot_debut>mot : print(lig_av[exclam_av+2:-2]); sys.exit()
    lig_av=lig; exclam_av=exclam
print(lig_av[exclam_av+2:-2])

Dans ton script bash, tu remplaces cette ligne

adresse=`grep "$sortie!" indexdicoalexandre | awk -F "\"" '{printf "%s", $2}'`

par celle-ci

adresse=$(./entete_page_dico.py "$sortie")

Mon script n'est pas optimisé, et parcourt toutes les lignes du dictionnaire jusqu'à trouver la bonne. Si celui-ci est très gros, on peut faire mieux.

Édité : Correction

Dernière modification par pingouinux (Le 29/08/2014, à 16:58)

Hors ligne

#3 Le 29/08/2014, à 17:05

Le Goss

Re : [Résolu] Bash: chercher mot dans un doc en ligne à partir d'un index

Parfait !
Ceci dit, il faudra vraiment que je me penche sur la syntaxe de python... au moins pour la comprendre à défaut de l'écrire.

pingouinux a écrit :

Mon script n'est pas optimisé, et parcourt toutes les lignes du dictionnaire jusqu'à trouver la bonne. Si celui-ci est très gros, on peut faire mieux.

Tout dépend ce que tu appelles "gros"; il devrait faire un peu plus de 1600 lignes; je parle du fichier d'index.


Si je pose une question sur le forum, ce n'est pas par paresse ou pour faire faire "mes devoirs"; c'est par ignorance: j'ai 51 berges. Et, par principe, je préfère être traité d'ignare que de fainéant.
Samsung i7-3630QM CPU @ 2.40GHz × 8 - 64 bits - RAM 7,7 Gio - DD 976 Go - Bodhi 6.0.0 Ubuntu 20.04
Allergique au wysiwyg; traitement à vie: Lilypond - LaTeX - txt2tags

Hors ligne

#4 Le 29/08/2014, à 17:10

pingouinux

Re : [Résolu] Bash: chercher mot dans un doc en ligne à partir d'un index

Si tu appelles le script une fois de temps en temps, ça devrait aller. Si tu l'appelais dans une boucle avec 100000 mots différents, il faudrait sans doute faire quelque chose.

Hors ligne

#5 Le 29/08/2014, à 17:55

Le Goss

Re : [Résolu] Bash: chercher mot dans un doc en ligne à partir d'un index

Je n'en suis pas là! je dois lancer quelque requêtes de temps en temps.
Je me rendrais vraiment compte lorsque l'index sera terminé. Je ne manquerais pas de revenir ici donner des nouvelles et déposer l'index (s'il n'est pas trop long et encombrant pour le forum... et les modos).
Ça intéressera peut-être quelqu'un.
Si quelqu'un peut déjà me dire si c'est faisable...

Merci pour ton aide!
Sujet résolu.


Si je pose une question sur le forum, ce n'est pas par paresse ou pour faire faire "mes devoirs"; c'est par ignorance: j'ai 51 berges. Et, par principe, je préfère être traité d'ignare que de fainéant.
Samsung i7-3630QM CPU @ 2.40GHz × 8 - 64 bits - RAM 7,7 Gio - DD 976 Go - Bodhi 6.0.0 Ubuntu 20.04
Allergique au wysiwyg; traitement à vie: Lilypond - LaTeX - txt2tags

Hors ligne