2017-04-01 1 views
0

Mit einem sehr besonderen Problem. Die Funktion extract nimmt eine XML-Datei und erstellt ein Diktat mit Restaurantbewertungen als Schlüssel. Hier mache ich eine grundlegende Vorverarbeitung für den Text, da ich ihn für die Stimmungsanalyse verwende: Der Text wird in Token umgewandelt, die Interpunktion wird entfernt und vor dem Wiedereinfügen in das Diktat wird sie "un-tokenisiert".Warum führt die Vorverarbeitung dazu, dass ich Wörterbuchschlüssel verliere?

import string 
from nltk.tokenize import word_tokenize, RegexpTokenizer 
tokenizer = RegexpTokenizer(r'\w+') 

def preprocess(file): 
    d = extract(file) 
    for text in list(d.keys()): 
     tokenized_text = tokenizer.tokenize(text) 
     text2 = ''.join([" "+i if not i.startswith("'") and i not in string.punctuation else i for i in tokenized_text]).strip() 
     d[text2] = d.pop(text) 
    return d 

Von den 675 Bewertungen fehlen 2, nachdem diese Funktion ausgeführt wurde. Das sind "toller Service". und köstlich'. Ich würde erwarten, dass diese zurückgegeben werden, so wie sie sind, außer der Punkt sollte von der ersten entfernt werden.

Als Referenz die extract Funktion:

from collections import OrderedDict, defaultdict 
import xml.etree.ElementTree as ET 

def extract(file): 

    tree = ET.parse(file) 
    root = tree.getroot() 

    if file == 'EN_REST_SB1_TEST.xml': 
     d = OrderedDict() 
     for sentence in root.findall('.//sentence'): 
      opinion = sentence.findall('.//Opinion') 
      if opinion == []: 
       text = sentence.find('text').text 
       d[text] = 0 

     return d 

Wenn jemand mit den SemEval ABSA Aufgaben vertraut ist, beachten Sie die ich getan habe dies in einem etwas Umwegen, nicht die Verwendung der ID-Tags machen in der XML, aber ich würde lieber bleiben, wie ich es gemacht habe.

+1

Sie verwenden die Bewertungen als Schlüssel, was bedeutet, dass Sie alle Duplikate verlieren. Könnte es sein, dass diese * sehr * kurzen Reviews zweimal auftraten? – alexis

+0

Ja - das ist es. Sehr offensichtlich, jetzt denke ich darüber nach. Was wäre die beste Alternative? – user3058703

+0

Um Ihren Ansatz so zu fixieren, dass er Ihren Zielen entspricht. Ich würde sie nur in einer Liste sammeln, aber ich kann es nicht sicher sagen, weil ich nicht weiß, was Sie erreichen wollen, warum Sie Werte als Schlüssel verwenden oder warum Sie dafür sorgen, dass Duplikate verloren gehen. Vielleicht eine neue Frage **, die die Aufgabe erklärt und nach der richtigen Datenstruktur fragt? – alexis

Antwort

1

Sie verwenden die Bewertungen als Schlüssel, was bedeutet, dass Sie alle Duplikate verlieren. Offensichtlich traten diese sehr kurzen Rezensionen zweimal auf.

Ich kann mir keinen Grund vorstellen, die Bewertungen als Schlüssel zu verwenden, vor allem, wenn Sie daran interessiert sind, Duplikate zu behalten. Warum also nicht einfach in eine Liste aufnehmen?

d = [] 
... 
d.append(text) 
+0

Habe das Satz-ID-Attribut im XML als Schlüssel verwendet, was ich von Anfang an hätte tun sollen. Danke für Ihre Hilfe! – user3058703

Verwandte Themen