Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

O que estou fazendo de errado? Programa para extrair palavras de um texto ignorando caracteres de pontuação ,etc...

    def palavras(self):
        import string
        lista_palavras = set()#evitar repeticoes
        count = 0
        with open(arq) as f:

            for linha in f:
                for pal in linha.split():
                    for i in string.punctuation:
                        if i in pal:
                            pal = pal.replace(i,"")

                        pal = pal.lower()
                        lista_palavras.add(pal)

            lista_palavras={pal for pal in lista_palavras if len(pal) >0}
            print(sorted((lista_palavras)))# o problema quer uma lista!

O código faz parte de uma classe:

class ArqTexto()

A saída (parte):

['"never-nevermore."\'', "'tis", '-', "`'tis", '`art', '`be', '`doubtless', '`doubtless,', "`doubtless,'", '`get', '`lenore', "`lenore'", '`nevermore', '`nevermore.', "`nevermore.'", '`or', '`other', '`prophet', "`prophet'", '`sir', '`sir,', "`sir,'", '`surely', 

Alguns caracteres que não consegui tirar acima: "." "'', "` "

O mais estranho que os caracteres estão em string.punctuation... Gostaria de entender o que fiz de errado!

2 respostas
solução!

Olá Edson!

Tudo bem!?

É um problema de identação

for pal in linha.split():
                    for i in string.punctuation:
                        if i in pal:
                            pal = pal.replace(i,"")
            #AQUI O PROBLEMA
                        pal = pal.lower()
                        lista_palavras.add(pal)

Para cada pontuação do string.punctuation você repete a palavra na sua lista de palavras. Como vc usa o set para remover as palavras repetidas o problema só aparece quando a palavra é seguida de alguma pontuação,

Como assim, né? Você quer remover a pontuação da seguinte string "python," e vamos dizer que a tring.punctuation seja apeans ".,-", e a lista de palavras esteja vazia. Então vamos para um teste de mesa:

Situação incial i = '' pal = "python," lista_palavras = []

Loop 1 i = '.' pal = 'python,' lista_palavras = {'python,'}

loop 2 i = ',' pal = 'python' (remove a ,) lista_palavras = {'python,' , 'python'}

loop 3 i = '-' pal = 'python,' lista_palavras = {'python,' , 'python'} como a estrutura de dados do lista_palavras é um set não repete a string 'python,'

Fim

Sua lista então guarta as palavras com pintuação e sem pontuação, da forma que estã o código se voçê tiver palavras com N acentos vai guardar em lista_palavras N variações da mesma palavra, para solucionar precisa apenas arruma a identação:

for pal in linha.split():
                   for i in string.punctuation:

                        if i in pal:
                            pal = pal.replace(i,"")
        #SOLUÇÃO
                    pal = pal.lower()
                    lista_palavras.add(pal)

Bom, assim você arruma o problema com seu código, mas têm outras maneiras de selecionar apenas palavras de um texto, usando REGEX tudo pode ficar mais simples e elegante, segue um exemplo com regex da mesma função que vc escreveu:

def palavras(self):
    import re
    with open(arq) as f:
        texto = f.read()
    print(sorted(set(re.findall(r'\w+', texto.lower())))

@Thiago G Santos: Muito obrigado! EU estava quebrando a cabeça para descobrir o erro!