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

Erro no RSLPStemmer

Durante a programação me deparei com um erro no RSLPStemmer onde o seguinte erro aparecia quando executava esse código

stemmer = nltk.stem.RSLPStemmer()
for i in texto:
    valida = [stemmer.stem(bolo) for bolo in i if bolo not in stopword]
    palavras.update(valida)

e então o seguinte erro aparecia

Traceback (most recent call last):
  File "Email.py", line 45, in <module>
    valida = [stemmer.stem(bolo) for bolo in i if bolo not in stopword]
  File "Email.py", line 45, in <listcomp>
    valida = [stemmer.stem(bolo) for bolo in i if bolo not in stopword]
  File "/anaconda3/lib/python3.6/site-packages/nltk/stem/rslp.py", line 103, in stem
    if word[-1] == "s":
IndexError: string index out of range

Resolvi trocar para o PorterStemmer mas acredito que ele funciona melhor com a língua inglesa, então estou sem soluções

Me Ajudem Por Favor :(

5 respostas

Ainda sem respostas

Olá Marcelo, tudo bem ?

Essa sua variável texto é uma lista de palavras?

O problema está acontecendo no método stemmer.stem(bolo). Esse método precisa receber a palavra para extrair a raiz. Talvez a compressão de lista esteja retornando um valor inválido para ele.

Aqui esta o meu codigo completo

import pandas as pd
import numpy as np
from sklearn.svm import LinearSVC 
from sklearn.model_selection import cross_val_score
from collections import Counter
import nltk
from sklearn.multiclass import OneVsRestClassifier,OneVsOneClassifier
from sklearn.naive_bayes import MultinomialNB
from sklearn.ensemble import AdaBoostClassifier

emails = pd.read_csv("emails.csv", encoding ='utf-8')
email = emails['email']

modelos = {"MultinomialNB": MultinomialNB(), 
"OneVsRestClassifier": OneVsRestClassifier(LinearSVC(random_state = 0)),
"OneVsOneClassifier": OneVsOneClassifier(LinearSVC(random_state = 0)),
"AdaBoostClassifier":AdaBoostClassifier(random_state = 0)}

texto = email.str.lower().str.split(" ")

def GetPalavra(dicta,texto):
    vetores = [0] * len(dicta)
    for i in texto:
        if i in dicta:
            vetores[dicta[i]] += 1
    return vetores

def fit(modelos,treino_dados,treino_marcacoes):
    resultado = {}
    k = 10
    for i in modelos:
        print(i)
        pontos = cross_val_score(modelos[i],treino_dados,treino_marcacoes, cv = k)
        taxa = np.mean(pontos) * 100
        resultado[taxa] = modelos[i]
    return resultado


stopword = nltk.corpus.stopwords.words("portuguese")
stemmer = nltk.stem.RSLPStemmer()

palavras = set()

for i in texto:
    valida = [stemmer.stem(bolo) for bolo in i if bolo not in stopword]
    palavras.update(valida)

zipado = list(zip(palavras,range(0,len(palavras))))

dicta = {Palavra:Indice for Palavra,Indice in zipado} 

resp = []
for i in texto:
    resp.append(GetPalavra(dicta,i))
marcas = emails['classificacao']

X = np.array(resp)
Y = np.array(marcas.tolist())



LengthDetreino = int(0.8 * len(X)) 

LengthDeValidacao = LengthDetreino - len(X)

treino_dados = X[:LengthDetreino]
treino_marcacao = Y[:LengthDetreino]

validacaoDados = X[LengthDetreino:]
validacaoMarca = Y[LengthDetreino:]



resultados = fit(modelos,treino_dados,treino_marcacao)
print(resultados)

for i in resultados:
    print("Modelo: {} Taxa: {}".format(resultados[i],i))




vencedor = resultados[max(resultados)]
print(max(resultados))
vencedor.fit(treino_dados,treino_marcacao)

resultado = vencedor.predict(validacaoDados)

acertos = resultado == validacaoMarca

total_de_acertos = sum(acertos)
total_de_elementos = len(validacaoMarca)

taxa_de_acerto = 100.0 * total_de_acertos / total_de_elementos

msg = "Taxa de acerto do vencedor com algoritmos no mundo real: {0}".format(taxa_de_acerto)
print(msg)

acerto_base = max(Counter(validacaoMarca).values())
taxa_de_acerto_base = 100.0 * acerto_base / len(validacaoMarca)
print("Taxa de acerto base: %f" % taxa_de_acerto_base)

total_de_elementos = len(validacaoDados)
print("Total de teste: %d" % total_de_elementos)
solução!

Olá Marcelo, tudo bem?

O erro está acontecendo pois existem no vetor bolo algumas palavras que tem o tamanho 0, ou seja, são strings vazias.

A maneira para resolver isso é fazer uma condição na hora que você faz o stem das palavras para ver se o tamanho é maior que 0 (len(bolo) > 0)

Dessa forma o código ficará assim:

for i in texto:
    valida = [stemmer.stem(bolo) for bolo in i if bolo not in stopword and len(bolo) > 0]
    palavras.update(valida)

Entendi!!! Muito Obrigado

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software