Você está na página 1de 22

http://nltk.sourceforge.net/doc/pt-br/tokenize.

html

Fundamentos de processamento lingstico:


tokenizao de textos e classificao de
palavras
Autores:
Contato:
Verso:
Reviso:
Data:
Copyright:
Licena:
Note

Steven Bird, Ewan Klein, Edward Loper


sb@csse.unimelb.edu.au
0.6.3
1.7
2006-01-29
2001-2006 University of Pennsylvania
Creative Commons Attribution-ShareAlike License

Este um esboo. Por favor, envie seus comentrios aos autores.

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).

2 Toquens: os blocos constituntes de um


texto
Como sabemos que determinada parte de um texto constitui uma palavra e de qual forma podemos
representar estas e as informaes a elas associadas em uma mquina? Pode parecer excessivamente
pedante exigir uma definio para "palavra"; no podemos dizer simplesmente que trata-se de uma
seqncia de caracteres com um espao no incio e outro fim? Com o evoluir do estudo, a questo
revela-se um pouco mais complexa. Para termos uma noo prtica dos problemas, vamos
considerar o seguinte texto retirado do Wall Street Journal:
Pargrafo 12 do arquivo ``wsj_0034``

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

palavra depende muito de quais so nossos objetivos.


Note
Caso nos voltemos para outras lnguas que no o ingls, a segmentao das palavras pode ser ainda
mais desafiadora. Por exemplo, na ortografia chinsa os caracteres correspondem a morfemas
monosilbicos. Muitos morfemas constituem por si prprios uma palavra, mas vrias palavras
contem mais de um morfema; a maioria constituda por dois morfemas. Apesar disso, no h
nenhuma representao visual dos limites das palavras em um texto em chins.
Vamos dar uma olhada mais detalhada s palavras do texto do WSJ. Suponhamos que os espaos
venham a ser utilizados como delimitadores de palavras e que a lista de todas as palavras do texto
tenha sido colocada em ordem alfabtica; podemos esperar por um resultado como o seguinte:
120, 1992, And, Barney, But, European, European, Fund, I, It, It,
Japanese, Korea, Mr, Porter, Smith, South, Spain, a, a, a, ...

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.

2.1 Representando toquens


Quando a linguagem escrita armazenada em um arquivo de computador, ela normalmente
representada por meio de uma seqncia ou string (do ingls, "cadeia") de caracteres. Isto , em um
arquivo de texto padro, as palavras so strings, as sentenas so strings e o prprio texto no passa,
no fundo, de uma longa string. Os caracteres de uma string no precisam ser necessariamente
alfanumricos; estas tambm podem incluir caracteres especiais que representem os espaos, as
tabulaes, os sinais de nova linha, etc.
Muito do processamento computacional realizado acima do plano dos caracteres. Quando

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.

Do ponto de vista do parser, este arquivo meramente uma string de caracteres:


'The_cat_climbed\nthe_tree.'
Note que utilizamos apstrofos para deimitar as strings, "_" para representar espaos e a expresso
"n" para representar uma nova linha.
Como acabamos de dizer, para toquenizar este texto e permitir sua utilizao pelo parser
necessrio indicar explicitamente quais substrings so palavras. Uma forma conveniente de se fazer
isto em Python dividir a string em uma lista de palavras, na qual cada palavra seja uma string,
como em 'dog'. [1] Em Python, uma lista representada como uma srie de objetos (neste caso,
strings) separados por vrgulas, delimitada por conchetes:
>>> palavras = ['the', 'cat', 'climbed', 'the', 'tree']
>>> palavras
['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'

Porm, como notamos em representing.tokens, normalmente prefervel representar um texto como


uma lista de toquens. Estas listas so normalmente criadas utilizando-se um toquenizador como o
tokenize.whitespace que separa as strings em palavras conforme os espaos:
>>> from nltk_lite import tokenize
>>> text = 'Hello world. This is a test string.'
>>> list(tokenize.whitespace(text))
['Hello', 'world.', 'This', 'is', 'a', 'test', 'string.']

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.']

O package nltk_lite.corpora disponibiliza acesso imediato a vrios corpora distribudos


com o NLTK, juntamente com toquenizadores built-in. Por exemplo, o brown.tagged() um
iterator sobre as sentenas com tags do Brown Corpus. Utilizamos a funo extract() para
extrair uma sentena que nos interesse:
>>> from nltk_lite.corpora import brown, extract
>>> print extract(0, brown.tagged('a'))
[('The', 'at'), ('Fulton', 'np-tl'), ('County', 'nn-tl'), ('Grand', 'jj-tl'),
('Jury', 'nn-tl'), ('said', 'vbd'), ('Friday', 'nr'), ('an', 'at'),
('investigation', 'nn'), ('of', 'in'), ("Atlanta's", 'np$'), ('recent', 'jj'),
('primary', 'nn'), ('election', 'nn'), ('produced', 'vbd'), ('``', '``'), ('no',
'at'), ('evidence', 'nn'), ("''", "''"), ('that', 'cs'), ('any', 'dti'),
('irregularities', 'nns'), ('took', 'vbd'), ('place', 'nn'), ('.', '.')]

Em particular, o brown.tagged() no apenas carrega o texto relevante em uma string, mas


tambm utiliza o toquenizador apropriado.

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

freqncia so geralmente inicializadas executando-se repetidamente uma experincia e


incrementando a contagem de cada valor toda vez que este for obtido como resultado. O programa a
seguir cria uma distribuio de freqncia que armazena o nmero de vezes que cada palavra ocorre
em um texto, exibindo ao final a palavra mais freqente:
>>> from nltk_lite.probability import FreqDist
>>> fd = FreqDist()
>>> for token in genesis.raw():
...
fd.inc(token)
>>> fd.max()
'the'

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]

Podemos plotar estes pontos usando a funo Plot definida em nltk_lite.draw.plot, da


seguinte forma: Plot(points).mainloop().

5 Uma aplicao prtica: prever a palavra


sucessiva
Distribuies de freqncia condicionais so muitas vezes utilizadas para prever certos
comportamentos. Prever, neste sentido, significa estimar um valor plausvel como resultado da
execuo de determinada experincia. A deciso de qual resultado fornecer normalmente uma
funo do contexto no qual a experincia realizada. Por exemplo, podemos tentar prever uma
palavra de um texto (o resultado) baseado-nos no texto que antecede esta palavra (o contexto).
Para prever os resultados de uma experincia, necessrio que, primeiramente, examinemos um
corpus de treinamento representativo, no qual o contexto e o resultado para cada execuo da
experincia j so conhecidos. Quando apresentados a uma nova execuo da experincia,
simplesmente escolhemos o resultado que ocorreu mais freqentemente naquele contexto
especfico.
Podemos utilizar uma ConditionalFreqDist para encontrar a ocorrncia mais freqente de

cada contexto. Primeiro, armazenamos cada resultado do corpus de treinamento, utilizando o


contexto no qual a experincia executada como condio. Ento, podemos acessar a freqncia de
distribuio para cada dado contexto usando este ltimo como ndice e, finalmente, utilizar o
mtodo max() para encontrar o resultado mais provvel.
Abaixo, usaremos uma ConditionalFreqDist para encontrar a palavra mais provvel em um
texto. Para iniciar, carregaremos um corpus a partir de um arquivo de texto e criaremos uma
ConditionalFreqDist vazia:
>>> from nltk_lite.probability import ConditionalFreqDist
>>> cfdist = ConditionalFreqDist()

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.

6 Classes de palavras e partes-do-discurso


Nas sees anteriores tratamos todas as palavras de forma muito semelhante: qualquer coisa era ou
no era um toquen. Porm, para muitas aplicaes, importante que possamos distinguir entre tipos
diferentes de tokens. Por exemplo, podemos querer marcar explicitamente que determinada string
um item lexical comum, que outra constitui uma expresso numrica e que outra ainda um sinal
de pontuao. Alm disto, podemos querer distinguir entre os diferentes tipos de itens lexicais: de
fato, h uma longa tradio no campo da lingstica em classificarem-se as palavras em categorias
chamadas partes-do-discurso. Estas tambm podem ser chamadas de classes de palavras ou de
categorias lexicais. Exemplos familiares so substantivo, verbo, preposio, adjetivo e advrbio.
Nesta seo apresentaremos os critrios padro para a categorizao de palavras desta forma,
discutindo as principais classes de palavras da lngua inglesa.

6.1 Categorizando palavras


Como decidimos a qual categoria uma palavra deve pertencer? Em geral, os lingistas valem-se de
trs tipos de avaliaes para tomar esta deciso: uma formal, uma sinttica (ou distributiva) e uma
conceitualista (ou semntica). Uma avaliao formal aquela que analisa a estrutura interna de uma
palavra. Por exemplo, -ness um sufixo que combina-se a um adjetivo para produzir um
substantivo. Exemplos so happy > happiness, ill > illness. [2] Assim, ao encontrarmos
uma palavra que termine em -ness, podemos com grande probabilidade identific-la como sendo
um substantivo. </para>
[2] Utilizamos > com o significado de 'deriva em'.
Um critrio sinttico considera os contextos sintticos nos quais uma palavra pode ocorrer. Por
exemplo, vamos assumir que j tenhamos definido a categoria dos substantivos. Em um critrio
sinttica para a lngua inglesa, podemos dizer que um adjetivo aquela palavra que ocorre
imediatamente antes de um substantivo ou que segue as palavras be e very. De acordo com estes
testes, near deveria ser categorizada como um adjetivo:
1. the near window
2. The end is (very) near.
Um exemplo conhecido de critrio conceitualista definir um substantivo como o "nome de uma
pessoa, lugar ou coisa". Dentro da lingstica moderna, critrios nocionais para definio de classes
de palavras tm sido vistos com considervel desconfiana, principalmente devido dificuldade de
se formalizar tais conceitos. Apesar disto, critrios conceitualistas so a base de muitas de nossas
intuies quanto a classes de palavras e nos permitem estimar, com uma boa probabilidade de
acerto, a categorizao de palavras em lnguas que desconhecemos; isto , se por exemplo
soubermos apenas que em holands verjaardag significa o mesmo que a palavra inglesa
birthday ou a portuguesa aniversrio, podemos supor que verjaardag seja um
substantivo tambm em holands. Porm, necessria cautela: mesmo que possamos traduzir zij

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.

6.2 Classes de palavras em ingls


Esta seo apresenta uma breve panormica sobre as classe de palavras na lngua inglesa. Leitores
interessados em maiores detalhes so aconselhados a consultar uma gramtica da lngua.
Linguists commonly recognize four major categories of open class words in English, namely nouns,
verbs, adjectives and adverbs. Nouns generally refer to people, places, things, or concepts, e.g.:
woman, Scotland, book, intelligence. In the context of a sentence, nouns can appear after
determiners and adjectives, and can be the subject or object of the verb:
Os lingistas costumam reconhecer quatro categorias principais de classes abertas de palavras em
ingls: substantivos, verbos, adjetivos e advrbios. Substantivos referem-se, geralmente, a pessoas,
lugares, coisas ou conceitos, como woman, Scotland, book, intelligence. No
contexto da sentena, os substantivos podem ser encontrados aps determinantes e adjetivos, e
podem ser o sujeito ou objeto de um verbo:
Padres sintticos envolvendo alguns
substantivos
Palavra
Aps um
Sujeito de
determinante um verbo
woman
the woman the woman
who I saw
sat down
yesterday ...
Scotland
the Scotland Scotland has
I remember five million
as a child ... people
book
the book I
this book
bought
recounts the
yesterday ... colonisation
of Australia
intelligence the
Mary's
intelligence intelligence
displayed by impressed
the child ... her teachers

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

wdt WH-determiner which what


whatever
whichever
wps WH-pronoun, that who
nominative
whoever
whosoever
what
whatsoever

6.3 Conjunto de tags das partes-do-discurso


Most part-of-speech tag sets make use of the same basic categories, such as noun, verb, adjective,
and preposition. However, tag sets differ both in how finely they divide words into categories; and
in how they define their categories. For example, is might be tagged as a verb in one tag set; but as
a distinct form of to be in another tag set -- in fact, we just observed the latter situation in the
Brown Corpus tag set. This variation in tag sets is unavoidable, since part-of-speech tags are used in
different ways for different tasks. In other words, there is no one 'right way' to assign tags, only
more or less useful ways, depending on one's goals.
A maior parte dos conjuntos de tags ("tag sets") utiliza as mesmas categorias bsicas, como
substantivo, verbo, adjetivo e preposio. Estes conjuntos de tags diferem, porm, tanto na extenso
com que as palavras so divididas em categorias quanto na forma como estas ltimas so definifas.
Por exemplo, is pode receber a tag de verbo em um determinado conjunto mas ser considerado
uma forma distinta de to be em outro -- de fato, obverservados este ltimo caso antes, no
conjunto de tags do Brown Corpus. Esta variao nos conjuntos de tags inevitvel, j que as tags
de partes-do-discurso so utilizadas de formas diferentes para diferentes tarefas. Em outras palavras,
no h uma "forma correta" de se atribuir tags, apenas h formas mais e menos apropriadas,
dependendo dos objetivos de cada um.
Observe como o processo de tagging simultaneamente descarta algumas distines (como por
exemplo a identidade lexical, que perdida quando todos os pronomes pessoais recebem a mesma
tag prp) e introduz novas, removendo ambigidades (como por exemplo deal que recebe a tag
vb ou a tag nn). Esta forma de operao facilita a classificao e predio. Observe que quando
introduzimos distines mais especficas no conjunto de tags obtemos uma melhor informao
quanto ao contexto lingstico, mas necessrio um trabalho maior para classificar cada toquen (h
um numero maior de tags possveis entre as quais escolher a correta). Da mesma forma, com um
menor nvel de distino entre as tags ser mais simples classificar cada toquen, mas uma
quantidade menor de informaes referentes ao contexto permencer disponvel.
In this tutorial, we will use the following tags: at (article) nn (Noun), vb (Verb), jj (Adjective),
in (Preposition), cd (Number), and end (Sentence-ending punctuation). As we mentioned, this is a
radically simplified version of the Brown Corpus tag set, which in its entirety has 87 basic tags plus
many combinations.
Neste tutorial, usaremos as seguintes tags: at (artigo), nn (substantivo), vb (verbo), jj (adjetivo),
in (preposio), cd (numeral), e end (pontuao de final de sentena). Como dissemos, esta uma
verso radicalmente simplificada do conjunto de tags do Brown Corpus, o qual em verso integral

apresenta 87 tags de base alm de vrias combinaes.

7 Representando toquens e corpora com tags


Nas sees anteriores foi discutida a natureza e a utilizao das tags no processamento lingstico.
Nesta seo introduziremos a representao computacional de tags. Primeiro iremos considerar os
tokens marcados individualmente com tags, mostrando de que forma eles so criados e como
podem ser acessados; finalmente nos interessaremos pelos corpora com tags.
Por conveno, um toquen com tag representado utilizando-se um tuple do Python:
>>> tok = ('fly', 'nn')
>>> tok
('fly', 'nn')

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).

8.1 Classificao automtica de palavras


Um corpus com tags pode ser utilizado para treinar um classificador simples que pode ser utilizado
para estimar a tag de palavras ainda no classificadas. Para cada palavra, iremos contar o nmero de
vezes que esta recebe cada tag. Por exemplo, a palavra deal recebe 89 vezes a tag nn e 41 vezes a
tag vb. Baseados nisso, se tivessemos de estimar uma tag para a palavra deal, escolheramos nn,
com um ndice de acerto de mais de dois teros. O programa listado a seguir executa esta tarefa de
tagging quando treinado sobre a seo "g" do Brown Corpus (a chamada belles lettres, literatura
criativa considerada em funo de seu contedo esttico).
>>> cfdist = ConditionalFreqDist()
>>> for sentence in brown.tagged('g'):
...
for token in sentence:
...
word = token[0]
...
tag = token[1]
...
cfdist[word].inc(tag)
>>> for word in "John saw 3 polar bears".split():
...
print word, cfdist[word].max()
John np
saw vbd
3 cd-tl
polar jj
bears vbz

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')]

8.2 Explorando gneros textuais


Agora que podemos carregar uma quantidade significativa de texto com tags, possvel process-lo
e extrair deste informaes de interesse. O cdigo a seguir interage nos quinze gneros do Brown
Corpus (acessados por meio do mtodo brown.groups()). O material para cada gnero est
armazenado em um conjunto de arquivos (acessados por meio do mtodo brown.items()).
Estes so toquenizados em srie; a etepa seguinte verificar se cada toquen possui a tag md. Para
cada uma destas palavras, incrementamos a cotnagem. Este mtodo utiliza uma distribuo de
freqncia condicional, na qual a condio o gnero sendo analisado e o evento o verbo modal.
>>> cfdist = ConditionalFreqDist()
>>> for genre in brown.items:
# cada gnero
...
for sent in brown.tagged(genre):
# cada sentena
...
for (word,tag) in sent:
# cada toquen com tag
...
if tag == 'md':
# encontrado um verbo
modal
...
cfdist[genre].inc(word.lower())

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

string e exibir seu contedo.


#. Now, initialize a new token with Token(), using this text. Tokenize the text with
WhitespaceTokenizer, and specify that the result should be stored in the WORDS
property. Print the result.
#. Agora, inicialize um novo token com Token(), utilizando este texto. Toquenize o
texto com o WhitespaceTokenizer e especifique que o resultado dever ser
armazenado na propriedade WORDS. Exiba o resultado.
#. A seguir, calcule o numero de toquens utilizando a funo len() e exiba o resultado.
#. Finally, discuss shortcomings of this method for tokenizing text. In particular,
identify any material which has not been correctly tokenized. (You may need to look for
a more complex text.)
#. Finalmente, discuta as falhas deste mtodo de toquenizao de textos. Em especial,
identifique qualquer contedo que no tenha sido corretamente toquenizado (talvez seja
necessrio utilizar algum texto mais complexo).
1. Toquenizar um texto utilizando expresses regulares: Obtenha algum texto puro (por
exemplo, visitando uma pgina da web e salvando seu contedo como texto puro) e
armazene-o no arquivo 'corpus.txt' para que possas responder s questes seguintes.
#. Processadores de texto normalmente dividem em slabas as palavras ao final das
linhas (nas chamadas "quebra de linha"). Quando um documento processado por estes
programas convertido para texto puro, estas partes geralmente no so recombinadas.
fcil reconhecer estes casos procurando na web por palavras divididas, como
depart- ment. Crie um RegexpTokenizer que trate este tipo de palavra
quebrada como um token nico.
#. Considere o seguinte ttulo de um livro: This Is the Beat Generation: New York-San
Francisco-Paris ("Esta a Gerao Beat: Nova Iorque-So Francisco-Paris"). O que
seria necessrio para poder toquenizar este tipo de string de tal forma que cada nome de
cidade fosse armazenado como um nico toquen?
1. Concordncia: Escreva uma funo que receba uma palavra como argumento, e que procure
no Brown Corpus por ocorrncias desta palavra. Para cada ocorrncia, gere uma linha de
texto que contenha a palavra em questo em seu centro.
2. Lei de Zipf: Seja f(w) a freqncia de uma palavra w em um texto livre. Suponha que todas
as palavras do texto esto classificadas de acordo com suas freqncias, da mais freqnte
menos freqente. A Lei de Zipf diz que a freqncia de um tipo de palavra inversamente
proporcional sua classificao (ou seja, f*r=k, para alguma constante k). Por exemplo, a
quinquagsima (50a) palavra mais comum dever ocorrer trs vezes mais que a
centsimaquinquagsima (150a).
#. Escreva uma funo em Python para processar um longo texto e plote a freqncia
das palavras em relao sua classificao utilizando o mdulo nltk_lite.draw.plot. s
capaz de confirmar a Lei de Zipf? (Sugesto: conveniente ajustar os eixos para loglog) O que ocorre nas extremidades das linhas plotadas?

#. Gere um texto aleatrio, por exemplo utilizando random.choice("abcdefg


"), lembrando de incluir o caractere de espao. Utilize o operador de concatenao de
strigns para acumular os caracteres em uma (realmente) longa string. A seguir,
toquenize esta string e gere um grfico Zipf como acima, comparando os dois grficos.
O que pode-se deduzir a respeito da Lei de Zipf a partir disto?
#. Trabalhando com texto com tags: Escreva um programa que carregue o Brown Corpus e, dada
uma palavra, liste todas as tags possveis para esta e suas contagens de freqncia. Por exemplo,
para a palavra strike o programa dever gerar: [('nn', 25), ('vb', 21)]. (Sugesto:
esta tarefa envolve reverter e ordenar a lista de tuples que estar na forma [(21, 'vb'), (25,
'nn')]. Para converter estas listas forma requerida, use word_freq = [(y,x) for
(x,y) in freq_word].)
#. Use seu programa para exibir as tags e suas freqncias para as seguintes palavras:
can, fox, get, lift, like, but, frank, line, interest.
Assegure-se de que voc conhece o significado de cada uma das tags mais freqentes.
#. Escreva um programa para encontrar as 20 palavras que possuem as maiores
variedades de tags.
#. Escolha palavras que podem ser tanto substantivos quanto verbos (como deal).
Tente adivinhar qual a tag mais provvel para cada palavra e confira se voc est
certo.
#. Prevendo a prxima palavra: o programa para previso de palavras que vimos neste captulo
prende-se rapidamente em ciclos. Modifique o programa de forma que cada palavra seja escolhida
aleatoriamente entre uma lista das n palavras mais provveis no contexto dado. (Sugesto: armazene
as n palavras mais provveis em uma lista lwords e ento escolha aleatoriamente uma palavra a
partir desta lista com o mtodo random.choice())
#. Escolha um gnero especfico, como uma seo do Brown Corpus, uma traduo do
livro do Gnesis ou um dos corpora de grupos de discusso ("newsgroups"). Treine seu
sistema neste corpus e faa-o gerar texto aleatoriamente. Voc pode experimentar com
diferentes palavras iniciais. O texto resultante intelegvel? Examine os pontos fortes e
fracos deste mtodo para gerao aleatria de texto.
#. Repita a experincia com diferentes gneros e com diferentes quantidades de dados
para treinamento. O que voc pode observar?
#. Agora, treine seu sistema utilizando dois gneros distintos e experimente com a
gerao de texto de um gnero hbrido. Como na questo anterior, discuta sobre suas
observaes.
#. Classificao automtica de palavras: o programa para a classificao de palavras como
substantivos ou adjetivos obteve um ndice de acerto de 71%. Vamos tentar criar condies
melhores para obter um sistema com ndice de acerto de 80% ou mais.
#. Considere a alternativa de utilizar um sufixo mais longo, como por exemplo os
ltimos dois ou trs caracteres. O que acontece com o desempenho? Quais sufixos so
reconhecidos como pertinentes aos adjetivos?

#. Explore outras alternativas, como utilizar um comprimento varivel de prefixos, o


comprimento das prprias palavras ou o nmero de vogais em uma palavra.
#. Por ltimo, combine as mltiplas condies em um tuple e explore quais
combinaes de condies fornecem os melhores resultados.
#. Escreva um programa para implementar um ou mais testes de legibilidade
(http://en.wikipedia.org/wiki/Readability, em ingls).
#. Projete um algoritmo que encontre as frases estatisticamente improvveis de uma coleo de
documentos. http://www.amazon.com/gp/search-inside/sipshelp.html/

NLTK

Você também pode gostar