Visualisation en nuage de mots avec Oracle
La représentation en nuage de mots-clés est très répandue pour donner une impression de l’importance relative – en terme de fréquence d’apparition – des termes au sein de données textuelles. Ici, j’exploite les informations du modèle de classification Bayésienne construit dans le billet « Classification Bayésienne Naïve avec Oracle » pour extraire les mots les plus utilisés par catégorie.
Le détail du modèle est accessible via la fonction DBMS_DATA_MINING.GET_MODEL_DETAILS_NB. Il s’agit d’une fonction PIPELINE dont le champ (nested table) CONDITIONALS permet d’obtenir les probabilités conditionnelles des différents termes. Cette information peut ensuite être utilisée comme indicateur de popularité des mots au sein d’une catégorie:
C’est le principe des la vue suivante qui extrait les 40 mots les plus « populaires » de la catégorie Polars:
SQL> CREATE OR REPLACE VIEW mots_freq_polar
2 AS
3 SELECT attribute_subname mot,
4 ROUND (100 * conditional_probability, 1) freq
5 FROM TABLE (DBMS_DATA_MINING.GET_MODEL_DETAILS_NB ('BOOKS_NB')) a,
6 TABLE (a.conditionals) b
7 WHERE INSTR (attribute_str_value, '[') = 0
8 AND target_attribute_str_value = 'polar'
9 ORDER BY conditional_probability DESC
10 FETCH FIRST 40 ROWS ONLY;
View created.
SQL>
SQL> column mot format a30
SQL> SELECT *
2 FROM mots_freq_polar
3 FETCH FIRST 10 ROWS ONLY;
MOT FREQ
------------------------------ ----------
ENQUÊTE 24.3
BIEN 21.9
FEMME 21.4
VIE 18.8
MORT 18.1
ANS 18
DEUX 15.9
ROMAN 15.8
JEUNE 14.6
POLICE 14.5
10 rows selected.
SQL>
Pour générer le graphique, j’utilise ici Oracle Data Visualisation Desktop qui dispose d’une visualisation « Nuage de mots-clés »:
Dans un cadre plus général, il est possible d’obtenir un décompte des termes à partir d’une source textuelle à l’aide de la procédure CTX_DOC.TOKENS appliquée à un index textuel (ctxsys.context).
Exemple:
SQL> CREATE TABLE polar_tab (book_id PRIMARY KEY, extrait)
2 AS
3 SELECT ROWNUM book_id, a.extrait
4 FROM train_set_books a
5 WHERE categorie = 'polar';
Table created.
SQL>
SQL> CREATE INDEX POLAR_IDXTXT
2 ON polar_tab (extrait)
3 INDEXTYPE IS ctxsys.context
4 PARAMETERS ('LEXER BOOKS_NB_LEXER WORDLIST BOOKS_NB_WORDLIST STOPLIST BOOKS_STOPLIST SYNC(MANUAL)');
Index created.
SQL>
SQL> CREATE TABLE polar_tokens
2 (
3 QUERY_ID NUMBER,
4 TOKEN VARCHAR2 (64),
5 OFFSET NUMBER,
6 LENGTH NUMBER
7 );
Table created.
SQL>
SQL> BEGIN
2 FOR rec IN (SELECT *
3 FROM polar_tab)
4 LOOP
5 ctx_doc.tokens ('POLAR_IDXTXT',
6 rec.book_id,
7 'POLAR_TOKENS',
8 rec.book_id);
9 END LOOP;
10 END;
11 /
PL/SQL procedure successfully completed.
SQL>
SQL> COMMIT;
Commit complete.
SQL>
SQL> set pages 30
SQL> SELECT token, COUNT (*) cnt
2 FROM polar_tokens
3 GROUP BY token
4 ORDER BY 2 DESC
5 FETCH FIRST 15 ROWS ONLY;
TOKEN CNT
---------------------------------------------------------------- ----------
BIEN 1765
JEUNE 1744
ENQUÊTE 1715
DEUX 1710
FEMME 1637
VIE 1587
HOMME 1537
ANS 1404
MORT 1318
ROMAN 1200
MONDE 1088
POLICE 1004
VILLE 930
AFFAIRE 914
JOUR 908
15 rows selected.
SQL>
