使用 treetagger 时出错:列出索引超出范围

问题描述

我正在使用 treetagger 来提取词的引理。我有一个函数可以做到这一点,但对于某些词,它给出了列表范围错误

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('\t')
            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

有没有办法克服这个错误,似乎“dns-remlacé”这个词引起了问题,但我要求如果“|”没有找到,这个词会自动发送到字典中。 错误

...
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','départ']
départ
['est','VER:pres','être']
être
['amusante','ADJ','amusant']
amusant
['mais','KON','mais']
mais
['elle','PRO:PER','elle']
elle
['est','être']
être
['très','ADV','très']
très
['mal','mal']
mal
['exploitée','VER:pper','exploiter']
exploiter
['en','en']
en
['raison','raison']
raison
['notamment','notamment']
notamment
["d'",'de']
de
['une','un']
un
['mise','mise']
mise
['en','en']
en
['scène','scène']
scène
['paresseuse','paresseux']
paresseux
[',','PUN','],["d'",'un']
un
['intrigue','intrigue']
intrigue
['à','à']
à
['laquelle','PRO:REL','lequel']
lequel
['on','on']
on
['ne','ne']
ne
['croit','croire']
croire
['pas','pas']
pas
['une','un']
un
['seconde','NUM','second']
second
['et','et']
et
["d'",'de']
de
['acteurs','acteur']
acteur
['qui','qui']
qui
['semblent','sembler']
sembler
['à','à']
à
["l'",'le']
le
['abandon','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','faux']
faux
['cul','cul']
cul
['ed','ed']
ed
['wright','wright']
wright
['dit','dire']
dire
['que','que']
que
['son','DET:POS','son']
son
['film','film']
film
['est','être']
être
['un','un']
un
['hommage','hommage']
hommage
['aux','PRP:det','au']
au
['buddy','buddy']
buddy
['movies','movies']
movies
['hollywoodiens','hollywoodien']
hollywoodien
['et','et']
et
['nottament','nottament']
nottament
['bad','bad']
bad
['dns-remplacé','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('\t')
     19             forme=parts[0]
---> 20             cat=parts[1]
     21             lemme = parts[2] # un seul mot
     22             print(lemme)

IndexError: list index out of range



文本示例:

解决方法

您正在获取列表索引超出范围错误,因为您正在为 \t 拆分对象并期望它返回包含 3 个组件的数组。 dns-substitute 似乎只在该列表中返回了 1 个对象。

在这个例子中你有 3 个对象:

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

这里你只有 1 个对象:

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

我建议您检查在 '\t' 上拆分是否返回大小为 3 的列表,如果没有,则您需要相应地处理该情况

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