Processamento de Linguagem Natural
em Perl
Alberto Sim˜es
o
ambs@perl.pt
Portuguese Perl Workshop
28 Setembro 2012
1 / 16
Disclaimer / Aviso
Ferramentas para a L´
ıngua Portuguesa do Projeto Natura
2 / 16
Identifica¸˜o de L´
ca ıngua
Lingua::Identify
Implementa¸˜o em Perl de v´rios algoritmos de identifica¸˜o
ca a ca
de l´
ıngua;
L´
ınguas detetadas: pt en de bg da es it fr fi hr nl ro ru pl el la
sq sv tr sl hu id uk;
3 / 16
Identifica¸˜o de L´
ca ıngua
Lingua::Identify
Implementa¸˜o em Perl de v´rios algoritmos de identifica¸˜o
ca a ca
de l´
ıngua;
L´
ınguas detetadas: pt en de bg da es it fr fi hr nl ro ru pl el la
sq sv tr sl hu id uk;
§ ¤
1 u s e Lingua : : Identify qw ( : l a n g u a g e _ i d e n t i f i c a t i o n ) ;
2 my $lang = langof ( $textstring ) ;
¦ ¥
3 / 16
Identifica¸˜o de L´
ca ıngua
Lingua::Identify
Implementa¸˜o em Perl de v´rios algoritmos de identifica¸˜o
ca a ca
de l´
ıngua;
L´
ınguas detetadas: pt en de bg da es it fr fi hr nl ro ru pl el la
sq sv tr sl hu id uk;
§ ¤
1 u s e Lingua : : Identify qw ( : l a n g u a g e _ i d e n t i f i c a t i o n ) ;
2 my $lang = langof ( $textstring ) ;
¦ ¥
§ ¤
1 u s e Lingua : : Identify qw ( : l a n g u a g e _ i d e n t i f i c a t i o n ) ;
2 my ( $lang , $prob ) = langof_file ( {
3 ’ a c t i v e −l a n g u a g e s ’ => [ ’ e s ’ , ’ p t ’ ] ,
4 } , $filename ) ;
¦ ¥
3 / 16
Identifica¸˜o de L´
ca ıngua
Lingua::Identify::CLD
Implementa¸˜o em C++ do Chromium Compact Language
ca
Detector;
C´digo C++ distribu´ diretamente no m´dulo Perl;
o ıdo o
Suporte para dezenas de l´
ınguas (incluindo pig-latin);
4 / 16
Identifica¸˜o de L´
ca ıngua
Lingua::Identify::CLD
Implementa¸˜o em C++ do Chromium Compact Language
ca
Detector;
C´digo C++ distribu´ diretamente no m´dulo Perl;
o ıdo o
Suporte para dezenas de l´
ınguas (incluindo pig-latin);
§ ¤
1 u s e Lingua : : Identify : : CLD ;
2
3 my $cld = Lingua : : Identify : : CLD−>new ( isPlainText => 0 ) ;
4 my $lang = $cld−>identify ( ”Text ” ) ;
¦ ¥
4 / 16
Segmenta¸˜o e Atomiza¸˜o
ca ca
Lingua::PT::PLNbase
Implementa¸˜o em Perl;
ca
Segmenta¸˜o e Atomiza¸˜o para a l´
ca ca ıngua Portuguesa;
Alguns hacks para dar resultados menos maus noutras l´
ınguas;
5 / 16
Segmenta¸˜o e Atomiza¸˜o
ca ca
Lingua::PT::PLNbase
Implementa¸˜o em Perl;
ca
Segmenta¸˜o e Atomiza¸˜o para a l´
ca ca ıngua Portuguesa;
Alguns hacks para dar resultados menos maus noutras l´
ınguas;
§ ¤
1 u s e Lingua : : PT : : PLNbase ;
2
3 # o b t e r l i s t a de p a l a v r a s / t o k e n s
4 my @atomos = atomiza ( $texto ) ;
5
6 # obter frases
7 my @frases = frases ( $texto ) ;
¦ ¥
5 / 16
Segmenta¸˜o e Atomiza¸˜o
ca ca
Lingua::FreeLing3
Interface ` biblioteca C++ freeling;
a
Suporte para RU, PT, ES, GA, CA, EN, IT;
Com outras funcionalidades avan¸adas (a ver. . . )
c
6 / 16
Segmenta¸˜o e Atomiza¸˜o
ca ca
Lingua::FreeLing3
Interface ` biblioteca C++ freeling;
a
Suporte para RU, PT, ES, GA, CA, EN, IT;
Com outras funcionalidades avan¸adas (a ver. . . )
c
§ ¤
1 u s e FL3 ’ en ’ ;
2
3 $tokens = tokenizer−>tokenize ( $text ) ;
4 $sentences = splitter−> s p l i t ( $tokens ) ;
¦ ¥
6 / 16
Segmenta¸˜o e Atomiza¸˜o
ca ca
Lingua::FreeLing3
Interface ` biblioteca C++ freeling;
a
Suporte para RU, PT, ES, GA, CA, EN, IT;
Com outras funcionalidades avan¸adas (a ver. . . )
c
§ ¤
1 u s e FL3 ’ en ’ ;
2
3 $tokens = tokenizer−>tokenize ( $text ) ;
4 $sentences = splitter−> s p l i t ( $tokens ) ;
¦ ¥
§ ¤
1 u s e FL3 ;
2 $atomos = tokenizer ( ’ p t ’)−>tokenize ( $texto ) ;
3 $frases = splitter ( ’ p t ’)−> s p l i t ( $atomos ) ;
¦ ¥
6 / 16
An´lise Morfol´gica
a o
Lingua::Jspell
Interface ` biblioteca/aplica¸˜o C jspell;
a ca
Biblioteca e aplica¸˜o inclu´ no m´dulo Perl;
ca ıda o
Funciona com dicion´rios semelhantes aos do ispell;
a
Sem desambigua¸˜o;
ca
Dicion´rios para PT, ES, LA, EN, FR.
a
7 / 16
An´lise Morfol´gica
a o
Lingua::Jspell
Interface ` biblioteca/aplica¸˜o C jspell;
a ca
Biblioteca e aplica¸˜o inclu´ no m´dulo Perl;
ca ıda o
Funciona com dicion´rios semelhantes aos do ispell;
a
Sem desambigua¸˜o;
ca
Dicion´rios para PT, ES, LA, EN, FR.
a
§ ¤
1 u s e Lingua : : Jspell ;
2 my $dict = Lingua : : Jspell−>new ( ”pt PT ” ) ;
3
4 my @radicals = $dict−>rad ( ”pode ” ) ; # p o d e r , p o d a r
5
6 my @analysis = $dict−>fea ( ” g a t i n h a ” ) ;
7 # { r a d =>’ g a t i n h a r ’ , . . } , { r a d =>’ g a t i n h a r ’ , . . } , { r a d =>’ g a t o ’ , . .
8
9 my @derivated = $dict−>der ( ”g a t o ” ) ;
10 # g a t a , g a t i n h o , g a t i n h a , g a t i n h o s , g a t a s , gato , g a t i n h a s , g .
¦ ¥
7 / 16
An´lise Morfol´gica
a o
Lingua::FreeLing3
Interface ` biblioteca C++ freeling;
a
Suporte para RU, PT, ES, GA, CA, EN, IT;
Com dete¸˜o de locu¸˜es, nomes pr´prios, entidades, etc.;
ca co o
E ainda outras funcionalidades (a ver. . . )
8 / 16
An´lise Morfol´gica
a o
Lingua::FreeLing3
Interface ` biblioteca C++ freeling;
a
Suporte para RU, PT, ES, GA, CA, EN, IT;
Com dete¸˜o de locu¸˜es, nomes pr´prios, entidades, etc.;
ca co o
E ainda outras funcionalidades (a ver. . . )
§ ¤
1 u s e FL3 ’ en ’ ;
2
3 my $tokens = tokenizer−>tokenize ( $text ) ;
4 my $sentences = splitter−> s p l i t ( $tokens ) ;
5 $sentences = morph−>analyze ( $sentences ) ;
6
7 # s e n t e n c e s ´ uma r e f e r ˆ n c i a p a r a uma l i s t a de o b j e t o s do
e e
8 # t i p o ‘ ‘ L i n g u a : : F r e e L i n g 3 : : Word ’ ’
9 my @analysis $sentences −>[0]−>analysis ;
¦ ¥
8 / 16
Etiqueta¸˜o de Part-of-Speech
ca
Lingua::FreeLing3
Desambigua¸˜o;
ca
Duas abordagens diferentes (hmm ou relax);
§ ¤
1 u s e FL3 ’ en ’ ;
2
3 my $tokens = tokenizer−>tokenize ( $text ) ;
4 my $sentences = splitter−> s p l i t ( $tokens ) ;
5 $sentences = morph−>analyze ( $sentences ) ;
6 $sentences = hmm−>tag ( $sentences ) ;
¦ ¥
9 / 16
Etiqueta¸˜o de Part-of-Speech
ca
Lingua::FreeLing3
Desambigua¸˜o;
ca
Duas abordagens diferentes (hmm ou relax);
§ ¤
1 u s e FL3 ’ en ’ ;
2
3 my $tokens = tokenizer−>tokenize ( $text ) ;
4 my $sentences = splitter−> s p l i t ( $tokens ) ;
5 $sentences = morph−>analyze ( $sentences ) ;
6 $sentences = hmm−>tag ( $sentences ) ;
¦ ¥
§ ¤
1 u s e FL3 ’ en ’ ;
2
3 my $tokens = tokenizer−>tokenize ( $text ) ;
4 my $sentences = splitter−> s p l i t ( $tokens ) ;
5 $sentences = morph−>analyze ( $sentences ) ;
6 $sentences = relax−>tag ( $sentences ) ;
¦ ¥
9 / 16
Parsing de Dependˆncias
e
Lingua::FreeLing3
Dispon´ para algumas das l´
ıvel ınguas do FreeLing3;
10 / 16
Parsing de Dependˆncias
e
Lingua::FreeLing3
Dispon´ para algumas das l´
ıvel ınguas do FreeLing3;
§ ¤
1 u s e FL3 ’ e s ’ ;
2
3 my $tokens = tokenizer−>tokenize ( $text ) ;
4 my $sentences = splitter−> s p l i t ( $tokens ) ;
5 $sentences = morph−>analyze ( $sentences ) ;
6 $sentences = hmm−>analyze ( $sentences ) ;
7 $sentences = chart−>parse ( $sentences ) ;
¦ ¥
10 / 16
NLGrep
com Lingua::FreeLing3
Procurar padr˜es (sequˆncias);
o e
com palavras, lemas, ou propriedades morfol´gicas;
o
11 / 16
NLGrep
com Lingua::FreeLing3
Procurar padr˜es (sequˆncias);
o e
com palavras, lemas, ou propriedades morfol´gicas;
o
$ fl3-nlgrep -l pt pg33056.txt ~ser A C A
era grosso e baixo
era excellente e detestavel
e
´ pura e severa
Sou exclusivo e pessoal
era orgulhoso e fraco
e
´ independente e superior
era grande e vistosa
era justo nem bonito
e
´ trivial e chocho
era restricta e mansa
(...)
11 / 16
NLGrep
com Lingua::FreeLing3
§ ¤
1 open my $fh , ”<: u t f 8 ” , $filename ;
2
3 w h i l e (my $l = <$fh >) {
4 my ( $tokens , $frases ) ;
5 $tokens = tokenizer−>tokenize ( $l ) ;
6 $frases = splitter−> s p l i t ( $tokens ) ;
7 $frases = morph−>analyze ( $frases ) ;
8 $frases = hmm−>tag ( $frases ) ;
9
10 # para cada f r a s e
11 f o r my $frase ( @$frases ) {
12 my @words = $frase−>words ;
13
14 # janela deslizante
15 w h i l e ( @words > @query ) {
16 i f ( match ( @words , @query ) ) {
17 show_match ( @words [ 0 . . $ # query ] )
18 }
19 s h i f t @words ;
20 } } }
¦ ¥
12 / 16
NLGrep
com Lingua::FreeLing3
§ ¤
1 # v e r i f i c a p a l a v r a s c o n t r a e x p r e s s ˜o
a
2 # de p e s q u i s a
3 s u b match {
4 f o r my $i ( 0 . . $#query ) {
5 # ignorar palavra se wildcard
6 n e x t i f $query −>[$i ] eq ” ” ;
7
8 # se procuramos p a l a v r a exacta
9 i f ( $query −>[$i ] =˜ / ˆ = ( . ∗ ) $ / ) {
10 r e t u r n 0 i f $1 ne $words −>[$i]−>lc_form ;
11 }
12 # s e p r o c u r a m o s p o r lema
13 e l s i f ( $query −>[$i ] =˜ / ˆ ˜ ( . ∗ ) $ / ) {
14 r e t u r n 0 i f $1 ne $words −>[$i]−>lemma ;
15 }
16 # c a s o c o n t r ´ r i o , e t i q u e t a POS
a
17 else {
18 my $tag = $words −>[$i]−>tag ;
19 r e t u r n 0 i f $tag ! ˜ /ˆ $query −>[$i ] / i ;
20 } }
21 return 1;
22 }
¦ ¥
13 / 16
NLGrep
com Lingua::FreeLing3
§ ¤
1 # imprime as p a l a v r a s .
2 s u b show_match {
3 p r i n t j o i n ( ” ” , map{ $_−>form } @_ ) , ”n ”
4 }
¦ ¥
14 / 16
Outras Ferramentas
Lingua::FreeLing3::Utils - conjunto de
fun¸˜es/comandos para c´lculo de n-grams, an´lise
co a a
morfol´gica e nlgrep, implementados em Fl3;
o
15 / 16
Outras Ferramentas
Lingua::FreeLing3::Utils - conjunto de
fun¸˜es/comandos para c´lculo de n-grams, an´lise
co a a
morfol´gica e nlgrep, implementados em Fl3;
o
XML::TMX - para lidar com mem´rias de tradu¸˜o;
o ca
15 / 16
Outras Ferramentas
Lingua::FreeLing3::Utils - conjunto de
fun¸˜es/comandos para c´lculo de n-grams, an´lise
co a a
morfol´gica e nlgrep, implementados em Fl3;
o
XML::TMX - para lidar com mem´rias de tradu¸˜o;
o ca
Lingua::NATools - para alinhamentos de textos paralelos e
extra¸˜o de terminologia/dicion´rios bilingues;
ca a
15 / 16
Outras Ferramentas
Lingua::FreeLing3::Utils - conjunto de
fun¸˜es/comandos para c´lculo de n-grams, an´lise
co a a
morfol´gica e nlgrep, implementados em Fl3;
o
XML::TMX - para lidar com mem´rias de tradu¸˜o;
o ca
Lingua::NATools - para alinhamentos de textos paralelos e
extra¸˜o de terminologia/dicion´rios bilingues;
ca a
Biblio::Thesaurus - para lidar com ontologias/thesauri;
15 / 16
Outras Ferramentas
Lingua::FreeLing3::Utils - conjunto de
fun¸˜es/comandos para c´lculo de n-grams, an´lise
co a a
morfol´gica e nlgrep, implementados em Fl3;
o
XML::TMX - para lidar com mem´rias de tradu¸˜o;
o ca
Lingua::NATools - para alinhamentos de textos paralelos e
extra¸˜o de terminologia/dicion´rios bilingues;
ca a
Biblio::Thesaurus - para lidar com ontologias/thesauri;
Lingua::PT::ProperNames - para dete¸˜o e extra¸˜o de
ca ca
nomes pr´prios;
o
15 / 16
Outras Ferramentas
Lingua::FreeLing3::Utils - conjunto de
fun¸˜es/comandos para c´lculo de n-grams, an´lise
co a a
morfol´gica e nlgrep, implementados em Fl3;
o
XML::TMX - para lidar com mem´rias de tradu¸˜o;
o ca
Lingua::NATools - para alinhamentos de textos paralelos e
extra¸˜o de terminologia/dicion´rios bilingues;
ca a
Biblio::Thesaurus - para lidar com ontologias/thesauri;
Lingua::PT::ProperNames - para dete¸˜o e extra¸˜o de
ca ca
nomes pr´prios;
o
Text::Ngram - c´lculo de ngrams (carateres);
a
15 / 16
Outras Ferramentas
Lingua::FreeLing3::Utils - conjunto de
fun¸˜es/comandos para c´lculo de n-grams, an´lise
co a a
morfol´gica e nlgrep, implementados em Fl3;
o
XML::TMX - para lidar com mem´rias de tradu¸˜o;
o ca
Lingua::NATools - para alinhamentos de textos paralelos e
extra¸˜o de terminologia/dicion´rios bilingues;
ca a
Biblio::Thesaurus - para lidar com ontologias/thesauri;
Lingua::PT::ProperNames - para dete¸˜o e extra¸˜o de
ca ca
nomes pr´prios;
o
Text::Ngram - c´lculo de ngrams (carateres);
a
Text::WordGrams - c´lculo de ngrams (palavras);
a
15 / 16