Professional Documents
Culture Documents
html
1 Introduo
Textos so geralmente representados em computadores por meio de arquivos que contem uma
seqncia potencialmente longa de caracteres. Para a maioria dos tipos de processamento
lingstico necessrio identificar e categorizar as palavras de um texto. Esta se revela uma tarefa
nada trivial. Neste captulo iremos introduzir os toquens como sendo os blocos constituntes dos
textos e mostraremos de que forma estes ltimos podem ser toquenizados. Em seguida, iremos
considerar a categorizao dos tokens de acordo com suas funes como parte-do-discurso, alm de
realizar uma explorao preliminar do Brown Corpus, uma conjunto de mais de um milho de
palavras em lngua inglesa com tags (informaes quanto categorizao das mesmas). Durante o
captulo sero apresentadas algumas aplicaes interessantes: gerao de textos aleatrios,
classificao automtica de palavras e anlise dos verbos modais em textos de diferentes gneros
(sempre em lngua inglesa).
It's probably worth paying a premium for funds that invest in markets
that are partially closed to foreign investors, such as South Korea,
some specialists say. But some European funds recently have
skyrocketed; Spain Fund has surged to a startling 120% premium. It has
been targeted by Japanese investors as a good long-term play tied to
1992's European economic integration. And several new funds that aren't
even fully invested yet have jumped to trade at big premiums.
"I'm very alarmed to see these rich valuations," says Smith Barney's
Mr. Porter.
Vamos comear pela string aren't. De acordo com nossa definio simplista, esta constitui uma
nica palavra. Mas considere a possibilidade de queremos verificar se todas as palavras de nosso
texto so listadas em um dicionrio e nosso dicionrio apresenta definies para are e not, mas
no para aren't. Neste caso, seria muito mais favorvel nossa pesquisa reconhecer em aren't
uma contrao de duas palavras distintas.
Se tomarmos nossa definio simplista de palavra literalmente (como deveramos fazer, caso
estejamos pensando em implement-la em cdigo), nos depararemos com outros menores mas
sempre reais problemas. Por exemplo, assumindo que nosso arquivo seja constitudo por linhas
separadas, como no texto do WSJ acima, ento todas as palavras que estiverem no incio de uma
linha no sero reconhecidas devido ausncia de um espao antes destas (a menos que
consideremos o caractere de "nova linha" como um espao). Segundo, de acordo com nosso
critrio, smbolos de pontuao iro fazer parte das palavras; ou seja, uma string como
investors, tambm ser considerada uma palavra, pois no h nenhum espao entre
investors e a vrgula que a segue. Conseqentemente, corremos o risco de no conseguir
reconhecer em investors, (com a vrgula final) um toquen do mesmo tipo de investors
(sem a vrgula final). Mais importante, seria interessante que os sinais de pontuao funcionassem
como "first-class citizen" para a toquenizao e a para o processamento subseqente. Por exemplo,
podemos desejar implementar uma regra que especifique que uma palavra seguida por um ponto
provavelmente uma abreviatura, caso a palavra que a siga inicie-se por letra minscula. Porm, para
formular este tipo de regra, necessrio que possamos identificar o ponto como um toquen isolado.
Um desafio um pouco diferente apresentado por exemplos como os seguintes (provenientes do
corpus MedLine [ref]):
1. This is a alpha-galactosyl-1,4-beta-galactosyl-specific adhesin.
2. The corresponding free cortisol fractions in these sera were 4.53 +/- 0.15% and 8.16 +/0.23%, respectively.
Em casos como estes, nos deparamos com termos que dificilmente seriam encontrados em qualquer
dicionrio ou vocabulrio no setorial da lngua inglesa. Alm disso, no teramos sucesso ao tentar
analisar sintaticamente estas strings utilizando uma gramtica padro do ingls. Para determinadas
finalidades, seria conveniente "agrupar" expresses como alpha-galactosyl-1,4-betagalactosyl-specific adhesin e 4.53 +/- 0.15% de forma a sereme reconhecidas
pelo parser como tomos no analisveis. Para isto, deveremos trat-las como "palavras" nicas
para qualquer finalidade dos processamentos subseqentes. O resultado geral disto tudo que,
mesmo que nos atenhamos a uma nica lngua como o ingls, a questo de como definir uma
Se a esta altura pedirmos a um programa que nos informe quantas palavras h no texto, ele
provavelmente fornecer como resposta 90. Esta resposta deve-se ao fato de que cada uma das trs
ocorrncias da palavra a est sendo considerada uma palavra isolada. Mas o que significa dizer que
determinado objeto a ocorre trs vezes? Estamos na presena de trs palavras a ou de uma nica
palavra repetida trs vezes? Podemos responder "ambos os casos", se traarmos uma distino entre
um toquen de palavra e um tipo de palavra. Um tipo de palavra algo abstrato; aquilo ao qual nos
referimos quando dizemos que conhecemos o significado da palavra deprecate ou quando
dizemos que as palavras barf e vomit so sinnimos. Por outro lado, um token de palavra algo
que existe no tempo e no espao. Por exemplo, podemos nos referir palavra grunge que
pronunciei em Edinburgo no dia 14 de julho de 2003; da mesma forma, podemos dizer que o
segundo toquen do texto do WSJ um toquen de tipo de palavra probably ou que h dois
toquens do tipo European no texto. Em termos mais gerais, podemos dizer que h 90 toquens de
palavras no texto do WSJ mas apenas 76 tipos de palavras.
Os termos toquen e tipo tambm podem ser aplicados a outras entidades lingsticas. Por exemplo,
um toquen de sentena uma ocorrncia individual de uma determinada sentena; mas um tipo de
sentena uma sentena em termos abstratos, sem contexto. Se algum repete uma sentena, este
algum pronunciou dois toquens de sentena, mas apenas um tipo de sentena foi utilizado. Neste
livro, quando a categoria de toquen ou tipo for bvia a partir do contexto, utilizaremos apenas os
termos token e tipo.
compilamos uma linguagem de programao, por exemplo, o compilador espera que o input (os
dados de entrada) seja uma seqncia de tokens com os quais ele seja capaz de lidar; por exemplo,
as classes dos identificadores, constantes textuais e alfanumricas. De forma anloga, um parser
espera que seu input seja uma seqncia de tokens de palavras e no uma seqncia de caracteres
individuais. Em sua forma mais simples, portanto, a toquenizao de um texto envolve a busca das
posies da string que contem os chamados "caracteres em branco" (espaos, tabulaes ou sinais
de nova linha) ou sinais de pontuao especficos, separando a string em toquens nestas posies.
Por exemplo, suponhamos que estejamos trabalhando com um arquivo que contenha as duas linhas
abaixo:
The cat climbed
the tree.
[1] Dissemos "conveniente" pois o Python possvel uma interao pela lista, processando os seus
elementos um a um.
Note que introduzimos uma nova varivel, chamada palavras, qual atribuda a lista e que
entramos com o nome da varivel em uma nova linha para verificar seu contedo.
Em resumo, acabamos de mostrar como, em sua forma mais simples, a toquenizao de um texto
pode ser realizada convertendo uma nica string representando o texto em uma lista de strings, na
qual cada elemento represente uma palavra.
3 Toquenizao
Muitas tarefas do processamento de linguagem natural envolvem a anlise de textos de dimenses
variadas, indo de uma nica sentena at corpora extensos. H vrias formas de se representar
textos usando o NLTK. A mais simples destas por meio de uma nica string. Estas strings podem
ser lidas diretamente de arquivos:
>>> text_str = open('corpus.txt').read()
>>> text_str
'Hello world. This is a test file.\n'
Note
Por "espao", no entendemos apenas o espao entre palavras, mas tambm as tabulaes e os finais
de linha.
A toquenizao pode normalizar um texto, por exemplo mapeando suas palavras para verses
apenas com letra minscula, expandindo contraes e at mesmo extrando o radical de cada
palavra, processo este conhecido por "stemming". Um exemplo de stemming listado abaixo:
>>> text = 'stemming can be fun and exciting'
>>> tokens = tokenize.whitespace(text)
>>> porter = tokenize.PorterStemmer()
>>> for token in tokens:
...
print porter.stem(token),
stem can be fun and excit
A toquenizao baseada em espaos simplista demais para a maioria das aplicaes; por exemplo,
ela falha ao separar a ltima palavra de uma frase ou sentena de caracteres de pontuao como a
vrgula, o ponto final, o ponto de exclamao e o ponto de interrogao. Como o nome sugere, o
tokenize.regexp utiliza uma expresso regular para determinar de que forma um texto deve
ser dividido. Esta expresso regular define os caracteres que podem constituir uma palavra vlida.
Para definir um toquenizador que inclua sinais de pontuao como toquens separados, poderiamos
utilizar:
>>> text = '''Hello. Isn't this fun?'''
>>> pattern = r'\w+|[^\w\s]+'
>>> list(tokenize.regexp(text, pattern))
['Hello', '.', 'Isn', "'", 't', 'this', 'fun', '?']
Tip
Lembre-se que \w+|[^\w\s]+ uma disjuno de duas subexpresses, w+ e [^\w\s]+. A
primeira destas aceita um ou mais caracteres "de palavra"; ou seja, caracteres que no sejam
espaos em branco ou sinais de pontuao. O segundo padro uma expresso negada; ela aceita
um ou mais caracteres que no sejam caracteres de palavra (ou seja, no aceita o conjunto \w) ou
espaos em branco (ou seja, no aceita o conjunto \s).
Tip
A expresso regular deste exemplo aceitar uma seqncia que seja constituda por um ou mais
caracteres de palavra \w+. Tambm aceitar uma seqncia que seja constituda por um ou mais
sinais de pontuao (ou caracteres no-palavra e no-espao, [^\w\s]+).
H vrias formas por meio das quais podemos melhorar esta expresso regular. Por exemplo, em
sua verso atual ela separa a string '$22.50' em quatro toquens distintos; podemos porm
desejar que ela identifique neste tipo de string um nico toquen. A soluo para isto modificar a
expresso regular, adicionado uma nova subexpresso que trate especificamente de strings neste
formato:
>>> text = 'That poster costs $22.40.'
>>> pattern = r'\w+|\$\d+\.\d+|[^\w\s]+'
>>> list(tokenize.regexp(text, pattern))
['That', 'poster', 'costs', '$22.40', '.']
Certas vezes, mais conveniente escrever uma expresso regular que aceite o que encontrado
entre os tokens, como os espaos em branco ou os sinais de pontuao. O construtor de funo
tokenize() aceita um parmetro booleano opcional gaps (em ingls, ---); quando definido
como True (em ingls, verdadeiro) o padro verificado against the gaps. Por exemplo, eis como
o whitespaceTokenize definido:
>>> list(tokenize.regexp(text, pattern=r'\s+', gaps=True))
['That', 'poster', 'costs', '$22.40.']
4 Contando toquens
Provavelmente, a coisa mais fcil que se possa fazer com os toquens, uma vez que tenham sido
extrados de um texto, cont-los. Podemos fazer isto como mostrado a seguir, quando
comparamos o comprimento das tradues para o ingls e para o finlands do livro do Gnesis:
>>> from nltk_lite.corpora import genesis
>>> len(list(genesis.raw('english-kjv')))
38240
>>> len(list(genesis.raw('finnish')))
26595
Podemos realizar uma contagem mais sofisticada por meio de uma distribuio de freqncia.
Geralmente, uma distribuio de freqncia armazena o nmero de vezes que cada determinado
valor ocorre como resultado de uma experincia. Neste caso, podemos utilizar uma distribuio de
freqncia para armazenar a freqncia de cada palavra em um documento. Distribuies de
Uma vez que tenhamos construdo uma distribuio de freqncia que armazene os resultados de
uma experincia, podemos utiliz-la para examinar uma srie de propriedades interessantes desta
experincia. Estas propriedades so resumidas abaixo:
Mdulo de distribuio de
freqncia
Cdigo de
Nome
exemplo Descrio
Contagem fd.count('t nmero de
he')
vezes que
determinado
resultado
ocorreu
Freqncia fd.freq('the freqncia
')
de um dado
resultado
N
fd.N()
nmero de
resultados
Resultados fd.samples lista com
()
cada
resultado
distinto
armazenado
Max
fd.max() resultado
com maior
nmero de
ocorrncia
Podemos utilizar uma FreqDist para examinar a distribuio do comprimento das palavras em
um determinado corpus. Para cada palavra, encontramos seu comprimento e incrementamos a
contagem para as palavras com aquele comprimento.
>>> def length_dist(text):
...
fd = FreqDist()
distribuio de freqncia vazia
...
for token in genesis.raw(text):
...
fd.inc(len(token))
palavra com este comprimento
...
for i in range(15):
entre 0 e 14
...
print "%2d" % int(100*fd.freq(i)),
de palavras com este comprimento
# inicializa uma
# para cada toquen
# encontrada outra
# para cada comprimento
# exibe a porcentagem
...
>>>
0
>>>
0
print
length_dist('english-kjv')
2 14 28 21 13 7 5 2 2 0
length_dist('finnish')
0 9 6 11 16 16 12 9 6 3
Uma condio especifica o contexto no qual uma experincia foi realizada. Normalmente nos
interessaremos pelos efeitos que as condies produzem no resultado de uma experincia. Por
exemplo, podemos querer examinar de que forma a distribuio do comprimento das palavras (o
resultado) influenciado pela letra inicial das mesmas (a condio). Distribuies de freqncia
condicionais fornecem uma ferramenta para explorar este tipo de questo.
Uma distribuio de freqncia condicional um conjunto de distribuies de freqncia para uma
mesma experincia, executada sob condies diferentes. As distribuies de freqncia individuais
so indexadas por sua condio.
>>> from nltk_lite.probability import ConditionalFreqDist
>>> cfdist = ConditionalFreqDist()
>>> for text in genesis.items:
...
for word in genesis.raw(text):
...
cfdist[text].inc(len(word))
Para plotar os resultados, construmos uma lista de pontos, onde a coordenada x refere-se ao
comprimento das palavras e a coordenada y freqncia de cada um destes comprimentos:
>>> for cond in cfdist.conditions():
...
wordlens = cfdist[cond].samples()
...
wordlens.sort()
...
points = [(i, cfdist[cond].freq(i)) for i in wordlens]
A seguir, examinaremos cada toquen neste corpus, incrementando a contagem apropriada para cada
um. A varivel prev ser utilizada para armazenar a palavra anterior.
>>> prev = None
>>> for word in genesis.raw():
...
cfdist[prev].inc(word)
...
prev = word
Note
Certas vezes, o contexto de uma experincia pode no estar disponvel ou no existir. Por exemplo,
no caso do primeiro toquen no h nenhum texto que o anteceda. Em situaes como esta, somos
obrigados a decidir qual contexto utilizar. Neste exemplo, utilizamos o None (do ingls, "nada")
como contexto para o primeiro toquen. Outra opo teria sido descartar as informaes do primeiro
toquen.
Uma vez que tenhamos construdo uma distribuio de freqncia condicional para o corpus de
treinamento, podemos utiliz-la para encontrar a palavra mais provvel para um dado contexto. Por
exemplo, tomando por contexto a palavra living, possvel inspecionar todas as palavras que
ocorreram no mesmo.
>>> word = 'living'
>>> cfdist['living'].samples()
['creature,', 'substance', 'soul.', 'thing', 'thing,', 'creature']
We can set up a simple loop to generate text: we set an initial context, picking the most likely token
in that context as our next word, and then using that word as our new context:
Podemos criar um ciclo simples para gerar texto: determinamos um contexto inicial, selecionando o
toquen mais provvel para este contexto como a nossa prxima palavra, e ento utilizando esta
palavra como nosso novo contexto:
>>> word = 'living'
>>> for i in range(20):
...
print word,
...
word = cfdist[word].max()
living creature that he said, I will not be a wife of the land of the
land of the land
Esta abordagem simplista para a gerao de texto tende a prender-se em ciclos repetitivos, como
demostrado pelo texto gerado acima. Uma abordagem mais avanada poderia escolher
aleatoriamente cada palavra, com as palavras mais freqentes escolhidas um maior nmero de
vezes.
is van dag jarig como it's her birthday today ou hoje o seu (dela)
aniversrio, a palavra jarig na verdade um adjetivo em holands e no h uma
eqivalncia exata desta em ingls ou em portugus.
Todas as lnguas adquirem novos itens lexicais. A lista de palavras que recentemente foi adicionada
ao Oxford Dictionary of English inclui cyberslacker, fatoush, blamestorm, SARS,
cantopop, bupkis, noughties, muggle e robata. Note que todas estas palavras so
substantivos; isto se reflete no fato dos substantivos serem considerados uma classe aberta. Em
contraste, as preposies so consideradas uma classe fechada, ou seja, h um conjunto limitado de
palavras que pertence a tal classe (por exemplo, sempre em ingls, above, along, at,
below, beside, between, during, for, from, in, near, on, outside,
over, past, through, towards, under, up, with) e as mudanas ocorrem muito
gradualmente ao longo do tempo.
Em ingls, os substantivos podem ser morfologicamente complexos. Por exemplo, palavras como
books e women esto no plural. Como vimos anteriormente, palavras terminadas com o sufixo
-ness so substantivos derivados de adjetivos, como happiness e illness. O sufixo -ment
encontrado em alguns substantivos derivados de verbos, como em government e
establishment.
Os substantivos so geralmente divididos em substantivos comuns e substantivos prprios (ou
"nomes comuns" e "nomes prprios"). Substantivos prprios identificam ndividuos ou entidades
em particular, como Moses e Scotland, enquanto substantivos comuns so todos os restantes.
Outra distino importante existe entre substantivos contveis e substantivos incontveis (ou
"substantivos de massa"). Substantivos contveis so concebidos como entidades distintas que
podem ser contadas, como pig (por exemplo, one pig, two pigs, many pigs). Eles no
podem ocorrer com a palavra much (como em *``much pigs``). Substantivos incontveis, por outro
lado, no so vistos como entidades distintas (por exemplo, sand). Eles no podem ser
pluralizados e no podem ocorrer com numerais (por exemplo, *``two sands``, *``many sands``).
Por outro lado, eles podem ocorrer com much (como em much sand).
Verbos so palavras que descrevem eventos e aes, como fall e eat. No contexto da sentena,
verbos expressam a relao envolvendo os referentes de um ou mais sintagmas nominais.
Padres sintticos envolvendo
alguns verbos
Palavra Simples Com
modificadores
e adjuntos (em
itlico)
fall
Rome Dot com
fell
stocks
suddenly fell
like a stone
eat
Mice
John ate the
eat
pizza with
cheese gusto
Verbos podem ser classificados de acordo com o nmero de argumentos (geralmente sintagmas
nominais) que os acompanham. A palavra fall ("cair") intransitiva, requerendo apenas um
argumento (a entidade que cai). A palavra eat ("comer") transitiva, requerendo dois argumentos
(o comedor e o comido). Outros verbos so mais complexos; por exemplo, put ("colocar") requer
trs argumentos: o agente que est realizando a ao de colocar, a entidade que est sendo colocada
em algum lugar e a sua localizao final. O sufixo -ing encontrado em substantivos derivados de
verbos, como the falling of the leaves (o que conhecido por gerndio).
Em ingls, verbos podem ser morfologicamente complexos. Por exemplo, o particpio presente de
um verbo termina em -ing e expressa a idia de estar em execuo, de uma ao incompleta
(como falling e eating). O particpio passado de um verbo geralmente termina em -ed e
expressa a idia de uma ao concluda (como fell e ate).
Duas outras importantes classes so os adjetivos e advrbios. Adjetivos descrevem substantivos e
podem ser utilizados como modificadores (por exemplo, large em the large pizza) ou em
predicados (por exemplo, the pizza is large). Em ingls, adjetivos podem ser
morfologicamente complexos (como fall<subscript>V</subscript>+ing em the
falling stocks). Advrbios modificam verbos para especificar o tempo, o modo, o lugar ou a
direo do evento descrito pelo verbo (como quickly em the stocks fell quickly).
Advrbios tambm podem modificar adjetivos (como really em Mary's teacher was
really nice).
O ingls possui vrias categorias de classes fechadas de palavras alm das preposies e cada
dicionrio e gramtica as classifica de forma diferente. A tabela abaixo fornece um exemplo de
classes fechadas de palavras, segundo a classificao utilizada no Brown Corpus. [3]
[3] Note que as tags para partes-do-discurso podem ser apresentadas tanto em letra maiscula
quando em letra minscula -- no h nenhuma significao resultante desta diferena.
Algumas classes de palavras
fechadas do ingls, com as tags do
Brown Tag
ap determiner/pron many other
oun, postnext more
determiner
last former
little several
enough
most least
only very
few fewer
past same
at
article
the an no a
every th'
ever' ye
cc conjunction,
and or but
coordinating
plus &
either
neither nor
yet 'n'
and/or
minus an'
cs conjunction,
that as after
subordinating whether
before while
like because
if since for
than until so
unless
though
providing
once lest till
whereas
whereupon
supposing
albeit then
in
preposition
of in for by
considering
to on among
at through
with under
into
regarding
than since
despite ...
md modal auxiliary should may
might will
would must
can could
shall ought
need wilt
pn pronoun,
none
nominal
something
everything
one anyone
nothing
nobody
everybody
everyone
anybody
anything
someone
no-one
nothin'
ppl pronoun,
itself
singular,
himself
reflexive
myself
yourself
herself
oneself
ownself
pp$ determiner,
our its his
possessive
their my
your her out
thy mine
thine
pp$$ pronoun,
ours mine
possessive
his hers
theirs yours
pps pronoun,
it he she
personal, nom, thee
3rd pers sng
ppss pronoun,
they we I
personal, nom, you ye thou
not 3rd pers sng you'uns
Podemos acessar as propriedades deste toquen da forma costumeira, como demonstrado abaixo:
>>> print tok[0]
fly
>>> print tok[1]
nn
Vrios corpora extensos (como o Brown Corpus e a partes do Wall Street Journal) passaram por um
processo de tagging manual, recebendo tags referentes s partes-do-discurso. Antes que possamos
utilizar estes corpora, necessrio que os carreguemos a partir dos arquivos que os contem e que
os toquenizemos.
Textos com tags so geralmente armazenados em arquivos como seqncias de toquens separados
por espaos em branco, onde cada toquen representado na forma texto/tag, como ilustrado
abaixo em uma seqncia extrada do Brown Corpus:
The/at grand/jj jury/nn commented/vbd on/in a/at number/nn of/in
other/ap topics/nns ,/, among/in them/ppo the/at Atlanta/np and/cc
Fulton/np-tl County/nn-tl purchasing/vbg departments/nns which/wdt it/pps
said/vbd ``/`` are/ber well/ql operated/vbn and/cc follow/vb generally/rb
accepted/vbn practices/nns which/wdt inure/vb to/in the/at best/jjt
interest/nn of/in both/abx governments/nns ''/'' ./.
possvel utilizar o mdulo nltk_lite.corpora para ler e toquenizar dados a partir de corpus
com tags, como vimos acima.
Eis outro exemplo que constroi toquens a partir de uma string:
>>> sent = """
... John/nn saw/vb the/at book/nn on/in the/at table/nn ./end He/nn
sighed/vb ./end
... """
>>> from nltk_lite.tag import tag2tuple
>>> for t in tokenize.whitespace(sent):
...
print tag2tuple(t),
('John', 'nn') ('saw', 'vb') ('the', 'at') ('book', 'nn') ('on', 'in') ('the',
'at') ('table', 'nn') ('.', 'end') ('He', 'nn') ('sighed', 'vb') ('.', 'end')
8 Mais aplicaes
Agora que podemos acessar um texto com tags, possvel realizar uma variedade de teis tarefas de
processamento. Iremos considerar aqui apenas duas: estimar a tag da parte-do-discurso de uma
palavra e explorar a distribuio de freqncia de verbos modais de acordo com o gnero de cada
texto (em lngua inglesa).
Note que bears recebeu incorretamente a tag de "forma na terceira pessoa do singular de um
verbo", pois esta palavra encontrada mais freqentemente como verbo que como substantivo na
literatura de fins estticos.
Um problema desta abordagem o fato dela resultar em um modelo extenso, com uma entrada para
cada combinao possvel de palavra e tag. Para certas tarefas, possvel construir modelos
razoavelmente bem sucedidos que, em comparao, so muito menores. Por exemplo, vamos tentar
estimar se uma palavra um verbo, um substantivo ou um adjetivo analisando apenas sua letra
final. Podemos fazer isto da seguinte forma:
>>>
>>>
...
...
...
...
>>>
>>>
>>>
>>>
...
>>>
>>>
tokens = []
for sent in brown.tagged('g'):
for (word,tag) in sent:
if tag in ['nn', 'jj'] and len(word) > 3:
char = word[-1]
tokens.append((char,tag))
split = len(tokens)*9/10
train, test = tokens[:split], tokens[split:]
cfdist = ConditionalFreqDist()
for (char,tag) in train:
cfdist[char].inc(tag)
correct = total = 0
for (char,tag) in test:
...
if tag == cfdist[char].max():
...
correct += 1
...
total += 1
>>> print correct*100/total
71
Este resultado de 71% marginalmente melhor que o resultado de 65% que obteramos ao
atribuirmos a tag nn a todas as palavras. Podemos inspecionar o modelo para ver qual tag
atribuda a cada palavra em funo de sua letra final. Desta forma, aprendemos que as palavras
terminadas em c ou l tm uma probabilidade maior de serem adjetivos do que substantivos.
>>> print [(c, cfdist[c].max()) for c in cfdist.conditions()]
[('%', 'nn'), ("'", None), ('-', 'jj'), ('2', 'nn'), ('5', 'nn'),
('A', 'nn'), ('D', 'nn'), ('O', 'nn'), ('S', 'nn'), ('a', 'nn'), ('c',
'jj'), ('b', 'nn'), ('e', 'nn'), ('d', 'nn'), ('g', 'nn'), ('f',
'nn'), ('i', 'nn'), ('h', 'nn'), ('k', 'nn'), ('m', 'nn'), ('l',
'jj'), ('o', 'nn'), ('n', 'nn'), ('p', 'nn'), ('s', 'nn'), ('r',
'nn'), ('u', 'nn'), ('t', 'nn'), ('w', 'nn'), ('y', 'nn'), ('x',
'nn'), ('z', 'nn')]
A distribuio condicional de freqncia nada mais que um mapeamento entre cada gnero e a
distribuio dos verbos modais em cada gnero. O fragmento de cdigo a seguir identifica um
pequeno conjunto de verbos modais de interesse e processa a estrutura de dados para exibir como
resultado as contagens requeridas.
>>> modals = ['can', 'could', 'may', 'might', 'must', 'will']
>>> print "%-40s" % 'Genre', ' '.join([("%6s" % m) for m in modals])
Genre
can could
may might
must
will
>>> for genre in cfdist.conditions():
# gera colunas
...
print "%-40s" % brown.item_name[genre],
...
for modal in modals:
...
print "%6d" % cfdist[genre].count(modal),
...
print
press: reportage
94
86
66
36
50
387
press: reviews
44
40
45
26
18
56
press: editorial
53
225
skill and hobbies
83
259
religion
54
64
belles-lettres
169
222
popular lore
95
163
miscellaneous: government & house organs
99
237
fiction: general
55
50
learned
202
330
fiction: science
8
16
fiction: mystery
31
17
fiction: adventure
27
48
fiction: romance
46
43
humor
9
13
122
56
74
37
273
59
130
22
84
59
79
12
249
216
213
113
168
142
165
45
115
37
152
13
39
168
42
366
159
325
126
16
49
12
44
145
13
57
48
154
58
79
195
11
51
17
33
H alguns padres interessantes nesta tabela. Por exemplo, compare as colunas para literatura
governamental ("miscellaneous: government & house organs") e literatura de aventura ("fiction:
adventure"); a primeira dominada pelo uso de can, may, must e will enquanto a ltima
caracterizada pelo uso de could e might. Com algum esforo adicional possvel estimar o
gnero de cada novo texto automaticamente, em funo de sua distribuio de verbos modais.
Agora que vimos como toquens com tags e corpora com tags so criados e acessados, estamos
prontos para dar uma olhada na categorizao automtica de palavras.
9 Leituras adicionais
John Hopkins Center for Language and Speech Processing, 1999 Summer Workshop on
Normalization of Non-Standard Words: Final Report
http://www.clsp.jhu.edu/ws99/projects/normal/report.pdf
Glossrio do SIL de termos lingsticos: http://www.sil.org/linguistics/GlossaryOfLinguisticTerms/
Language Files: Materials for an Introduction to Language and Linguistics (Eighth Edition), The
Ohio State University Department of Linguistics, http://www.ling.ohio-state.edu/publications/files/
10 Exerccios
#. Acessar e tokenizar um arquivo de texto: Obter algum texto puro (por exemplo, visitando uma
pgina da web e salvando seu contedo como texto puro) e armazenar no arquivo 'corpus.txt'.
#. Utilizando os mtodos open() e read(), carregar o texto em uma varivel de tipo
NLTK