Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.2k views
in Technique[技术] by (71.8m points)

python - Error when using treetagger : list index out of range

I am using treetagger to extract lemma of word. I have a function which do that but for some words it is giving list out range error :

def treetagger_process(texte):
    ''' process le texte et renvoie un dictionnaire '''
    
    d_tag = {}

    for line in texte:
        newvalues = tagger.tag_text(line)
        d_tag[line] = newvalues
        
    #print(d_tag)
    
    #lemmatisation  
    d_lemma = defaultdict(list)
    d_lemma_1 = defaultdict(list)
    for k, v in d_tag.items():
        print(k)
        for p in v:
            #print(p)
            parts = p.split('')
            print(parts)
            forme=parts[0]
            cat=parts[1]
            lemme = parts[2] # un seul mot
            print(lemme)
            try:
                if lemme =='':
                    d_lemma[k].append(forme)

                elif "|" in lemme :
                    print(lemme)
                    lemme_double = lemme.split("|")

                    lemme_final = lemme_double[1]
                    print(lemme_final)

                    d_lemma[k].append(lemme_final)

                else:
                     d_lemma[k].append(lemme)
                        
            except:
                print(parts)
                
                
    for k, v in d_lemma.items(): 
        d_lemma_1[k]=" ".join(v)
            
    
    # Suppression de l'espace
    print(d_lemma_1)
    return d_lemma_1

Is there a way to overcome that error, it seems the word "dns-remplacé" is causing problem but I requested that if "|" is not find , the word is automatically send to the dictionnary. error :

...
L'idée de départ est amusante mais elle est très mal exploitée en raison notamment d'une mise en scène paresseuse , d'une intrigue à laquelle on ne croit pas une seconde et d'acteurs qui semblent à l'abandon .
["L'", 'DET:ART', 'le']
le
['idée', 'NOM', 'idée']
idée
['de', 'PRP', 'de']
de
['départ', 'NOM', 'départ']
départ
['est', 'VER:pres', 'être']
être
['amusante', 'ADJ', 'amusant']
amusant
['mais', 'KON', 'mais']
mais
['elle', 'PRO:PER', 'elle']
elle
['est', 'VER:pres', 'être']
être
['très', 'ADV', 'très']
très
['mal', 'ADV', 'mal']
mal
['exploitée', 'VER:pper', 'exploiter']
exploiter
['en', 'PRP', 'en']
en
['raison', 'NOM', 'raison']
raison
['notamment', 'ADV', 'notamment']
notamment
["d'", 'PRP', 'de']
de
['une', 'DET:ART', 'un']
un
['mise', 'NOM', 'mise']
mise
['en', 'PRP', 'en']
en
['scène', 'NOM', 'scène']
scène
['paresseuse', 'ADJ', 'paresseux']
paresseux
[',', 'PUN', ',']
,
["d'", 'PRP', 'de']
de
['une', 'DET:ART', 'un']
un
['intrigue', 'NOM', 'intrigue']
intrigue
['à', 'PRP', 'à']
à
['laquelle', 'PRO:REL', 'lequel']
lequel
['on', 'PRO:PER', 'on']
on
['ne', 'ADV', 'ne']
ne
['croit', 'VER:pres', 'croire']
croire
['pas', 'ADV', 'pas']
pas
['une', 'DET:ART', 'un']
un
['seconde', 'NUM', 'second']
second
['et', 'KON', 'et']
et
["d'", 'PRP', 'de']
de
['acteurs', 'NOM', 'acteur']
acteur
['qui', 'PRO:REL', 'qui']
qui
['semblent', 'VER:pres', 'sembler']
sembler
['à', 'PRP', 'à']
à
["l'", 'DET:ART', 'le']
le
['abandon', 'NOM', 'abandon']
abandon
['.', 'SENT', '.']
.
"Faux cul ed wright dit que son film est un hommage aux buddy movies hollywoodiens et nottament bad boys.aussi se permet il de parodier des scènes de ce """"chef d'oeuvre""""au tics de caméra prés,et si on le savait pas déjà on se rend compte à quel point michael bay est un tacheron;Hot Fuzz ne se contente pas d'être une parodie de plus à la """"y'a t-il un flic..."
['"', 'PUN:cit', '"']
"
['Faux', 'ADJ', 'faux']
faux
['cul', 'NOM', 'cul']
cul
['ed', 'NOM', 'ed']
ed
['wright', 'NOM', 'wright']
wright
['dit', 'VER:pper', 'dire']
dire
['que', 'KON', 'que']
que
['son', 'DET:POS', 'son']
son
['film', 'NOM', 'film']
film
['est', 'VER:pres', 'être']
être
['un', 'DET:ART', 'un']
un
['hommage', 'NOM', 'hommage']
hommage
['aux', 'PRP:det', 'au']
au
['buddy', 'NOM', 'buddy']
buddy
['movies', 'NOM', 'movies']
movies
['hollywoodiens', 'ADJ', 'hollywoodien']
hollywoodien
['et', 'KON', 'et']
et
['nottament', 'VER:pres', 'nottament']
nottament
['bad', 'NOM', 'bad']
bad
['dns-remplacé', 'ADJ', 'dns-remplacé']
dns-remplacé
['<repdns text="boys.aussi" />']
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-25-a8bd3e42b86e> in <module>
     21         #l_1_dict = spacy_process(l_1)
     22         #l_1_dict = spacy_process_treet(l_1)
---> 23         l_1_dict = treetagger_process(l_1)
     24 
     25         print(type(l_1_dict))

<ipython-input-24-20ed242ad8de> in treetagger_process(texte)
     18             parts = p.split('')
     19             forme=parts[0]
---> 20             cat=parts[1]
     21             lemme = parts[2] # un seul mot
     22             print(lemme)

IndexError: list index out of range



Example of texte :


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Youre getting the list index out of range error because youre splitting on an object for and expecting it to return an array of 3 components. the dns-substitute seems to only have 1 object returned in that list.

in this example you have 3 objects:

bad
['dns-remplacé', 'ADJ', 'dns-remplacé']

here you only have 1 object:

dns-remplacé
['<repdns text="boys.aussi" />']

i would recommend you check that splitting on '' returns a list of size 3 and if it doesnt then you need to handle that scenario accordingly

 parts = p.split('')
 if len(parts) == 3:
      #do normal processing
 else:
      #handle this situation

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...