Parser de texto simples

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

Parser de texto simples

an_drade
Olá pessoal,

Tenho um conjunto de mensagens de mails, em texto, dos quais preciso
extrair todas as palavras para um dicionário. Queria eliminar todos
sinais de pontuação e outros elementos não textuais, como traços em
assinaturas, endereços de mail, etc.

Queria uma solução realmente simples, preferenfialmente um pacote,
lib, ou cookbook já implementado, onde forneço o texto (string ou
descritor de arquivo) e ele me devolve as somente as palavras em uma
lista ou qualquer estrutura de dados. Alguém tem alguma sugestão?

Desde já agradeço,

Carlos

--
Carlos Eduardo de Andrade
Reply | Threaded
Open this post in threaded view
|

Re: Parser de texto simples

Thiago Holanda-3
Procure algo sobre expressão regular (ou Regular Expressions, no python:
import re). Pode te ajudar.


Thiago Holanda




2010/6/18 Carlos Eduardo de Andrade <[hidden email]>

>
>
> Olá pessoal,
>
> Tenho um conjunto de mensagens de mails, em texto, dos quais preciso
> extrair todas as palavras para um dicionário. Queria eliminar todos
> sinais de pontuação e outros elementos não textuais, como traços em
> assinaturas, endereços de mail, etc.
>
> Queria uma solução realmente simples, preferenfialmente um pacote,
> lib, ou cookbook já implementado, onde forneço o texto (string ou
> descritor de arquivo) e ele me devolve as somente as palavras em uma
> lista ou qualquer estrutura de dados. Alguém tem alguma sugestão?
>
> Desde já agradeço,
>
> Carlos
>
> --
> Carlos Eduardo de Andrade
>  
>


[As partes desta mensagem que não continham texto foram removidas]



------------------------------------

,-----------------------------------------------------------.
| Antes de enviar um e-mail para o grupo leia:              |
| http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar  |
| E se você é usuário do BOL lembre-se de cadastrar o       |
| e-mail do grupo na lista branca do seu sistema anti-spam. |
`-----------------------------------------------------------´Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/python-brasil/

<*> Para sair deste grupo, envie um e-mail para:
    [hidden email]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html


Reply | Threaded
Open this post in threaded view
|

Re: Parser de texto simples

Paulo Eduardo Neves-3
In reply to this post by an_drade
In [6]: re.split(r"\W+", "abc-def.hij    u8i")
Out[6]: ['abc', 'def', 'hij', 'u8i']

Se quiser tirar as duplicatas:
set(re.split(r"\W", "abc-def.hij u8i"))

Se os emails estiverem no formato mbox, o módulo mailbox será útil
para remover os headers.



Em 18 de junho de 2010 16:51, Carlos Eduardo de Andrade
<[hidden email]> escreveu:

> Olá pessoal,
>
> Tenho um conjunto de mensagens de mails, em texto, dos quais preciso
> extrair todas as palavras para um dicionário. Queria eliminar todos
> sinais de pontuação e outros elementos não textuais, como traços em
> assinaturas, endereços de mail, etc.
>
> Queria uma solução realmente simples, preferenfialmente um pacote,
> lib, ou cookbook já implementado, onde forneço o texto (string ou
> descritor de arquivo) e ele me devolve as somente as palavras em uma
> lista ou qualquer estrutura de dados. Alguém tem alguma sugestão?
>

--
Paulo Eduardo Neves
http://www.mosquito.pro.br
Reply | Threaded
Open this post in threaded view
|

Re: Parser de texto simples

Allison Vollmann
Só completando, você pode utilizar o módulo 'email' para extrair partes da mensagem.

ex:

import email
message = email.get_message_from_file(open('message.eml','r'))

if message.get_content_type() == 'multipart/mixed':
....for part in message.walk():
........if part.get_content_type() == 'plain/text'
............process_message(part.get_payload())
else:
....process_message(message.get_payload())


Neste caso ele já trata mensagens encaminhadas ou mixas (html/texto). No caso de mensagens enviadas só com html, você teria que ter um cuidado em especial

A[]'s
       

--- Em sex, 18/6/10, Paulo Eduardo Neves <[hidden email]> escreveu:

De: Paulo Eduardo Neves <[hidden email]>
Assunto: Re: [python-brasil] Parser de texto simples
Para: [hidden email]
Data: Sexta-feira, 18 de Junho de 2010, 17:41







 



 


   
     
     
      In [6]: re.split(r"\W+", "abc-def.hij    u8i")

Out[6]: ['abc', 'def', 'hij', 'u8i']



Se quiser tirar as duplicatas:

set(re.split(r"\W", "abc-def.hij u8i"))



Se os emails estiverem no formato mbox, o módulo mailbox será útil

para remover os headers.



Em 18 de junho de 2010 16:51, Carlos Eduardo de Andrade

<[hidden email]> escreveu:

> Olá pessoal,

>

> Tenho um conjunto de mensagens de mails, em texto, dos quais preciso

> extrair todas as palavras para um dicionário. Queria eliminar todos

> sinais de pontuação e outros elementos não textuais, como traços em

> assinaturas, endereços de mail, etc.

>

> Queria uma solução realmente simples, preferenfialmente um pacote,

> lib, ou cookbook já implementado, onde forneço o texto (string ou

> descritor de arquivo) e ele me devolve as somente as palavras em uma

> lista ou qualquer estrutura de dados. Alguém tem alguma sugestão?

>



--

Paulo Eduardo Neves

http://www.mosquito.pro.br



   
     

   
   

       
 
   
   
     
       
            |
       
           através de email |
         Responder através da web |
            Adicionar um novo tópico
     

                Mensagens neste tópico
          (2)
           






      Atividade nos últimos dias:

   
           
      Novos usuários
      8
   
                                             
   
 
    Visite seu Grupo
 


       
     


      ,-----------------------------------------------------------.

| Antes de enviar um e-mail para o grupo leia:              |

| http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar  |

| E se você é usuário do BOL lembre-se de cadastrar o       |

| e-mail do grupo na lista branca do seu sistema anti-spam. |

`-----------------------------------------------------------´      


   
           
     
     
                 
            Perfumes com até 70% de desconto e Frete Grátis! Clique aqui!          
                         
                         
                        Perfumes com até 70% de desconto e Frete Grátis! Clique aqui!          
                         
                         
                        JAN, FEV e MARÇO são os melhores meses para conseguir  um novo EMPREGO          
             
   
 

 
  Trocar para: Só Texto, Resenha Diária • Sair do grupo • Termos de uso




   

 
 
 



     




     

  .


   


__

,_._,___


 



 






     

[As partes desta mensagem que não continham texto foram removidas]

Reply | Threaded
Open this post in threaded view
|

Re: Parser de texto simples

an_drade
Muito obrigado Allison... Nda como um regex simples... Preciso aprender a
usar isso direito!

[]'s

Carlos

2010/6/18 Allison Vollmann <[hidden email]>

>
>
> Só completando, você pode utilizar o módulo 'email' para extrair partes da
> mensagem.
>
> ex:
>
> import email
> message = email.get_message_from_file(open('message.eml','r'))
>
> if message.get_content_type() == 'multipart/mixed':
> ....for part in message.walk():
> ........if part.get_content_type() == 'plain/text'
> ............process_message(part.get_payload())
> else:
> ....process_message(message.get_payload())
>
> Neste caso ele já trata mensagens encaminhadas ou mixas (html/texto). No
> caso de mensagens enviadas só com html, você teria que ter um cuidado em
> especial
>
> A[]'s
>
>
> --- Em sex, 18/6/10, Paulo Eduardo Neves <[hidden email]<pauloneves%40gmail.com>>
> escreveu:
>
> De: Paulo Eduardo Neves <[hidden email] <pauloneves%40gmail.com>>
> Assunto: Re: [python-brasil] Parser de texto simples
> Para: [hidden email]<python-brasil%40yahoogrupos.com.br>
> Data: Sexta-feira, 18 de Junho de 2010, 17:41
>
>
>
>
> In [6]: re.split(r"\W+", "abc-def.hij u8i")
>
> Out[6]: ['abc', 'def', 'hij', 'u8i']
>
> Se quiser tirar as duplicatas:
>
> set(re.split(r"\W", "abc-def.hij u8i"))
>
> Se os emails estiverem no formato mbox, o módulo mailbox será útil
>
> para remover os headers.
>
> Em 18 de junho de 2010 16:51, Carlos Eduardo de Andrade
>
> <[hidden email] <ce.andrade%40gmail.com>> escreveu:
>
> > Olá pessoal,
>
> >
>
> > Tenho um conjunto de mensagens de mails, em texto, dos quais preciso
>
> > extrair todas as palavras para um dicionário. Queria eliminar todos
>
> > sinais de pontuação e outros elementos não textuais, como traços em
>
> > assinaturas, endereços de mail, etc.
>
> >
>
> > Queria uma solução realmente simples, preferenfialmente um pacote,
>
> > lib, ou cookbook já implementado, onde forneço o texto (string ou
>
> > descritor de arquivo) e ele me devolve as somente as palavras em uma
>
> > lista ou qualquer estrutura de dados. Alguém tem alguma sugestão?
>
> >
>
> --
>
> Paulo Eduardo Neves
>
> http://www.mosquito.pro.br
>
> |
>
> através de email |
> Responder através da web |
> Adicionar um novo tópico
>
>
> Mensagens neste tópico
> (2)
>
>
> Atividade nos últimos dias:
>
> Novos usuários
> 8
>
>
>
>
> Visite seu Grupo
>
>
> ,----------------------------------------------------------.
>
> | Antes de enviar um e-mail para o grupo leia:              |
>
> | http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar  |
>
> | E se você é usuário do BOL lembre-se de cadastrar o       |
>
> | e-mail do grupo na lista branca do seu sistema anti-spam. |
>
> `----------------------------------------------------------´
>
> Perfumes com até 70% de desconto e Frete Grátis! Clique aqui!
>
>
> Perfumes com até 70% de desconto e Frete Grátis! Clique aqui!
>
>
> JAN, FEV e MARÇO são os melhores meses para conseguir um novo EMPREGO
>
>
>
>
> Trocar para: Só Texto, Resenha Diária • Sair do grupo • Termos de uso
>
> .
>
> __
>
> ,_._,___
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>



--
Carlos Eduardo de Andrade
Institute of Computing  --  UNICAMP
http://www.ic.unicamp.br/~andrade


[As partes desta mensagem que não continham texto foram removidas]



------------------------------------

,-----------------------------------------------------------.
| Antes de enviar um e-mail para o grupo leia:              |
| http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar  |
| E se você é usuário do BOL lembre-se de cadastrar o       |
| e-mail do grupo na lista branca do seu sistema anti-spam. |
`-----------------------------------------------------------´Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/python-brasil/

<*> Para sair deste grupo, envie um e-mail para:
    [hidden email]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html


Reply | Threaded
Open this post in threaded view
|

Re: Parser de texto simples

Paulo Eduardo Neves-3
m 18 de junho de 2010 18:42, Carlos Eduardo de Andrade
<[hidden email]> escreveu:
>> In [6]: re.split(r"\W+", "abc-def.hij u8i")
>>
>> Out[6]: ['abc', 'def', 'hij', 'u8i']

Ah! Você terá problemas com acentos:

re.split(r"\W+", "açaí")
['a', 'a', '']

Veja como resolver aqui:
http://www.mosquito.pro.br/2008/09/processando-texto-em-portugus-usando.html

Uma solução mais eficiente é usar um iterador, especialmente se o
texto a processar for muito grande. Com o iterator você não precisará
ter todos os dados na memória de uma vez:

f = re.finditer('\w+', 'abc-def.hij u8i')
for i in f:print i.group(0),

Acho que todo desenvolvedor tem que saber o feijão com arroz de
expressões regulares. Recomendo fortemente este livro:
http://astore.amazon.com/agenddosambachor/detail/0596528124
É um dos clássicos da O'Reilly

O problema só é que depois de lê-lo, você vai querer usar regexps para
tudo. Até mesmo fantasiar a respeito:
http://xkcd.com/208/

abs
--
Paulo Eduardo Neves
http://www.mosquito.pro.br
Reply | Threaded
Open this post in threaded view
|

Re: Parser de texto simples

Roger Demetrescu
2010/6/18 Paulo Eduardo Neves <[hidden email]>:

[SNIP]

> O problema só é que depois de lê-lo, você vai querer usar regexps para
> tudo. Até mesmo fantasiar a respeito:
> http://xkcd.com/208/

É, mas nesse caso se tratava de um serial killer... é totalmente
justificável...  :)


Falando sério agora, eu recomendo e muito o material do Aurélio
Marinho Jargas: [1]

A versão online da 1a edição de seu livro pode ser encontrada aqui: [2]

Abraços



[1] - http://aurelio.net/er/
[2] - http://guia-er.sourceforge.net/