0

我正在使用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-remplace”这个词引起了问题,但我要求如果“|” 找不到,单词会自动发送到字典。错误 :

...
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('\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



文本示例:

4

1 回答 1

0

您正在获取列表索引超出范围错误,因为您正在为 \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
于 2021-01-12T17:13:06.793 回答