fred voisin

(smart (music (engines)))

Accueil > Trucs et astuces > txt stats (LispMe)

txt stats (LispMe)

2 fév. 2009

lundi 2 février 2009, par Fred

Outils d’analyse de fichiers texte pour LispMe sur PalmOS, donnant la liste et la fréquence des mots d’un fichier de l’application « Memos ».
Ce prototype de code pour expérimenter un comparateurs de textes par contenu, en recourant à un classifieur par apprentissage, de type carte auto-organisatrice (SOM) par exemple...

- La fonction l-o-w donne la liste des mots d’un « memo », chaque mot étant entouré par un ou plusieurs caractères spéciaux définis entre guillemets par la variable *s* ;

- La fonction wcount calcule la fréquence d’une liste de mots à travers le filtre défini par la fonction word?, où :
- un mot est constirué de plus de 2 caractères ;
- un nombre n’est pas un mot ;
- la variable *nw* défini la liste des mots exclus (entre guillemets) ;
- les majuscules sont converties en minuscules...

exemple :

A faire :

- choisir la « catégorie » du mémo à analyser (fonction dir) ;
- appliquer sur une liste de mémos et/ou l’ensemble d’une « catégorie » (interface graphique ?) ;
- exporter les résultats dans un mémos ;
- définir les mots exclus dqns un mémo ;
- typer les entrées (liste ou string) selon la sortie désirée ;
- implémenter un comparateur pour les fautes de frappes (distance d’édition) ;
- optimiser...


;txt stats
;fredvoisin:com

;separateurs
(define *s* "\"(/'-)!?{[]},:> <;.")

;mots exclus
(define *nw* '("une" "les" "ils" "elle" "elles" "ces" "cette" "ceux" "celle" "celles" "qui" "que" "dont" "quoi" "mais" "pour" "par" "dans" "ici" "ainsi" "tel" "tels" "telle" "telles" "laquelle" "lequel" "lesquels" "lesquelles" "auquel" "auxquels" "duquel" "desquels" "sinon" "enfin" "sans" "des"
))

(define (word? string w)
(if string
 (if (or (< (length (string->list string)) 3) (member string w) (number? (string->object string)))
#f #t)))

(define (split liste s)
(let ((tmp (list)) (r (list)) (lsep (string->list s)))
 (do ((i 0 (+ i 1))) ((= i (length liste)) (reverse (cons  (reverse tmp) r)))
  (if (member (list-ref liste i) lsep)
(begin (set! r (cons (reverse tmp) r)) (set! tmp (list)))
  (set! tmp (cons (list-ref liste i) tmp))))))

(define (lchar2st lchar)
(let ((st (make-string (length lchar) #\ )))
 (if (null? lchar) #f
 (do ((i 0 (+ i 1))) ((= i (length lchar)) st)
 (let* ((c (list-ref lchar i)) (n (char->integer c)))
  (if (and (> n 64) (< n 91))
   (string-set! st i (integer->char (+ 32 n)))
    (string-set! st i c)))))))

(define (wcount los w)
(let ((r (list)))
 (do ((i 0 (+ i 1))) ((= i (length los)) r)
 (let ((c (list-ref los i)))
  (if (word? c w)
  (let ((a (assoc c r)))
   (if a
   (let ((p (position a r)))
    (set-cdr! (list-ref r p) (list (+ 1 (cadr a)))))
   (set! r (cons (list (list-ref los i) 1) r)))))))))

(define (l-o-w file s)
(let ((f (open-input-file file))
(l (list)) (line ""))
 (do ((i 0 (+ i 1))) ((eof-object? line) (map lchar2st l))
  (set! line (read-line f))
  (if (not (eof-object? line))
   (set! l (append (split (string->list line) s) l)) ))))