O-Auto-Falante

W3log de Tiago Charters de Azevedo (Comentários para: tca@diale.org)

diale.org | RSS | Última actualização: 2008-09-14 [16:30]

Aspectos computacionais das linguagens naturais

# | 2008-03-31

Tenho há já algum tempo andado a estudar alguns aspectos computacionais das linguagens naturais.

A primeira abordagem foi a construção do algoritmo de Porter para Português, no entanto deparado com a versão mais antiga e a versão mais "rigorosa" fiquei com a dúvida, que ainda persiste, se a última não poderá ainda ser melhorada. Isto é, usando um dicionário mais completo, aquele que tenho contém meio milhão de palavras, e usando um número menor de excepções.

No entanto o algoritmo de Porter para português em Emacs Lisp ficou pelo caminho. Encontrei o SNOBOL, o que teve como consequência imediata a reescrita quase total do código original em termos de funções em Lisp que implementam as instruções em SNOBOL. O prazo que impus a mim mesmo para acabar o código acabou e fiquei apenas com um punhado de funções em Lisp que implementa apenas parte do algoritmo.

Depois disso uma pesquisa levou-me a Noam Chomsky e primeiro ao The Minimalist Program e depois ao Syntactic Structures. Deste último partilho da opinião do Donald Knuth

"...researchers in linguistics were beginning to formulate rules of grammar that were considerably more mathematical than before. And people began to realize that such methods are highly relevant to the artificial languages that were becoming popular for computer programming, even though natural languages like English remained intractable. I found the mathematical approach to grammar immediately appealing..."

O que ficou, e está ainda aqui dentro a ressoar, é a pergunta: como relacionar a determinação dos sufixos, usando o algoritmo de Porter, já que estes determinam os tempos verbais, plural, etc, das palavras, e as regras de transformação de que fala Chomsky? Como construir as formas computacionais, leia-se gramática universal, tendo apenas como base, os sufixos e o que eles determinam, e a estrutura sintáctica?

Talvez a resposta passe pelos crocodilos (palavras) e os seus ovos (sufixos)?!

The fundamental aim in the linguistic analysis

# | 2008-03-30

The fundamental aim in the linguistic analysis of a language L is to separate the grammatical sequences which are the sentences of L from the ungrammatical sequences which are note sentences of L. The grammar of L will thus be a device that generates all of the grammatical sequences of L and none of the ungrammatical ones.

Noam Chomsky, Syntactic Structures, 2nd ed., Mouton (2002)

Pelo relógio

# | 2008-03-29

Alguns detalhes

# | 2008-03-29

Panorama

# | 2008-03-29

Mathematics and Industry Group

# | 2008-03-28

Novo grupo para discussão no Google Groups.

http://groups.google.com/group/mathematics-and-industry-group

Veritatis via bona est

# | 2008-03-27

Hacker book

# | 2008-03-26

Quem o terá lido em 1985?

Ref: http://catb.org/~esr/faqs/hacker-howto.html

Simetrias: propositadas ou aparentes

# | 2008-03-22

Ecce Homo

# | 2008-03-21

museu/instituição:	 	Museu Nacional de Arte Antiga
supercategoria:	 	 	Artes Plásticas e Artes Decorativas
categoria:	 	 	Pintura
denominação:	 	 	Ecce Homo
autor(es):	 	 	Mestre Desconhecido
datação:  	   	   	1570 d.C.
dimensões: 	  	  	altura: 89 largura: 65

Avô, CT1NB

# | 2008-03-20

Engarrafamento

# | 2008-03-20

Ref: Shockwave traffic jam recreated for first time: NewScientist.com news service

Nova aquisição

# | 2008-03-18

Ver mais...

IBERICOS, IIIrd Iberian Cosmology Meeting

# | 2008-03-05

latex2png equation

http://ibericos.cii.fc.ul.pt

Algumas funções em Lisp para o algoritmo de Porter

# | 2008-03-02

Como referido no mês passado apenas sobrou a ideia e a vontade "numa mão cheia" de funções.

(setq max-lisp-eval-depth 100000)
(setq max-specpdl-size 10000)

Funções auxiliares

(defun list-to-string (l)
  "Return a STRING which is the concatenation of the elements of
L."
  (if (not l)
      nil
    (if (stringp (car l))
	(concat (car l) (list-to-string (cdr l)))
      (list-to-string (cdr l)))))

(defun join-string (xs &optional sep)
  (cond ((null xs) "")
	((null (cdr xs)) (car xs))
	(t (concat (car xs) (or sep "") (join-string (cdr xs) sep)))))

(defun string-to-strings (s)
    "Convert a string into a list of strings."
    (let ((i (- (length s) 1)) (l '()))
      (while (<= 0 i)
	(setq l (cons (aref s i) l)
	      i (- i 1)))
      (mapcar (lambda (x) (char-to-string x)) l)))

Definição das vogais em português

(setq vn (string-to-strings "aeiouáàéíóúâêôAEIOUÁÀÉÍÓÚÂÊÔ"))
(setq vnc (mapcar (lambda (x) (string-to-char x)) vn))
(defun vowelp (v)
  "É v uma vogal? Sim -> t, Não -> nil. "
  (if (eq () (memq  (string-to-char v) vnc)) nil t))

(defun consonantp (v)
  (if (vowelp v) nil t))

(defun tilde-rm (v)
  "ã -> a~, õ -> o~"
  (cond ((eq  (string-to-char '"ã") (string-to-char v)) "a~")
	((eq (string-to-char '"õ") (string-to-char v)) "o~")
	(v)))
(defun tilde-rm-string (str)
"Avião Cão-> Avia~o Ca~o"
  (join-string (mapcar (lambda (x) (tilde-rm x)) (string-to-strings str))))
(defun m (str)
  "#CV como está definido no artigo original do Porter"
  (let* ((i 0) (count 0))
    (while (< i (- (length (sts-rm-tnil str)) 1))
      (if (not (eq (nth i (sts-rm-tnil str)) (nth (+ i 1) (sts-rm-tnil str))))
	  (setq count (+ 1 count)))
      (setq i (+ i 1)))
    (if (evenp  count) (/ count 2) (/ (+ 1 count) 2))))
(defun R1 (str)
  "Returns R1 part of the word."
  (let*  ((lstr (string-to-strings(tilde-rm-string str))))
    (if (> (length  lstr) 1)
	(if (vowelp (car lstr))
	    (if (consonantp (cadr lstr))
		(join-string (cddr lstr))
	      (R1 (join-string (cdr lstr))))
	  (R1 (join-string (cdr lstr))))
      )))
(defun R2 (str)
  "Returns R1 part of R2."
  (R1 (R1 str)))
(defun RV (str)
  "Retunrs de RV part"
  (let*  ((lstr (string-to-strings(tilde-rm-string str))))
  (cond
   ((consonantp (cadr lstr ))
    (if (vowelp (caddr lstr))
	(if (consonantp (car (cdddr lstr)))
	    (join-string (cdddr lstr)) (join-string (cddddr lstr)))
      ((and (vowelp (car lstr)) (vowelp (cadr lstr)))
       (join-string (cdddr lstr)))))
   ((> (length  lstr) 3)  (join-string (cdddr lstr))))))
(defun sort-list-words-length (lstr)
  "Ordena as palavras, numa lista, por ordem decrescente do número de letras."
  (let ((j 0))
    (while (<= j (length lstr))
      (let ((i 0))
	(while (<= i (length lstr))
	  (if (< (length (nth i lstr)) (length (nth (+ 1 i) lstr)))
	      (swap lstr i (+ 1 i)) nil)
	  (setq i (+ 1 i))))
  (setq j (+ 1 j))))
  lstr)

Lista de sufixos

(setq list-suff
      '("eza" "ezas" "ico" "ica" "icos" "icas" "ismo" "ismos" "ável"
	"ível" "ista" "istas" "oso" "osa" "osos" "osas" "amento"
	"amentos" "imento" "imentos" "adora" "ador" "ação" "adoras"
	"adores" "ações" "ante" "antes" "ância"))
(setq list-suff-verbs
     '("ada" "ida" "ia" "aria" "eria" "iria" "ará" "ara" "erá" "era" "irá" "ava" "asse"
       "esse" "isse" "aste" "este" "iste" "ei" "arei" "erei" "irei" "am" "iam" "ariam" "eriam"
       "iriam" "aram" "eram" "iram" "avam" "em" "arem" "erem" "irem" "assem" "essem" "issem"
       "ado" "ido" "ando" "endo" "indo" "arão" "erão" "irão" "ar" "er" "ir" "as" "adas" "idas"
       "ias" "arias" "erias" "irias" "arás" "aras" "erás" "eras" "irás" "avas" "es" "ardes"
       "erdes" "irdes" "ares" "eres" "ires" "asses" "esses" "isses" "astes" "estes" "istes"
       "is" "ais" "eis" "íeis" "aríeis" "eríeis" "iríeis" "áreis" "areis" "éreis" "ereis"
       "íreis" "ireis" "ásseis" "ésseis" "ísseis" "áveis" "ados" "idos" "ámos" "amos"
       "íamos" "aríamos" "eríamos" "iríamos" "áramos" "éramos" "íramos" "ávamos" "emos"
       "aremos" "eremos" "iremos" "ássemos" "êssemos" "íssemos" "imos" "armos" "ermos"
       "irmos" "eu" "iu" "ou" "ira" "iras"))
(setq list-res-suff '("os" "a" "i" "o" "á" "í" "ó"))

Alguns testes

(R1 "Aleatoriamente" );"eatoriamente"
(R2 "Aleatoriamente" );"oriamente"
(RV "Aleatoriamente" );"toriamente"

Arquivo

# | 2008-03-01

Copyleft

1999-2008 (c) Tiago Charters de Azevedo São permitidas cópias textuais parciais/integrais em qualquer meio com/sem alterações desde que se mantenha este aviso.