Wie erstelle ich einen Merkmalsvektor für einen Klassifizierer, der auf die Erkennung von benannten Entitäten abzielt?

  • Ich habe eine Reihe von Tags (unterscheidet sich von den üblichen Namen, Orten, Objekten usw.). In meinem Fall sind sie domänenspezifisch und ich nenne sie: Entität, Aktion, Vorfall. Ich möchte diese als Samen für das Extrahieren von mehr benannten Entitäten verwenden.

    Ich bin auf dieses Dokument gestoßen: " Effiziente Support-Vektor-Klassifizierer für die Erkennung von benannten Entitäten " von Isozaki et al. Ich mag zwar die Idee, Support Vector Machines für die Erkennung von benannten Entitäten zu verwenden, aber ich bleibe fest bei der Kodierung des Merkmalsvektors. Für ihre Arbeit sagen sie Folgendes:

    Zum Beispiel lauten die Worte in "Präsident George Herbert Bush", sagte Clinton. . . "Werden wie folgt klassifiziert:" Präsident "= ANDERE," George "= PERSON-BEGIN," Herbert "= PERSON-MITTEL," Bush "= PERSON-END," sagte "= ANDERE," Clinton "= PERSON-SINGLE," ist " = ANDERE. Auf diese Weise wird das erste Wort des Namens einer Person als PERSON-BEGIN bezeichnet. Das letzte Wort wird als PERSON-END bezeichnet. Andere Wörter in dem Namen sind PERSON-MIDDLE. Wenn der Name einer Person durch ein einzelnes Wort ausgedrückt wird, wird er als PERSON-SINGLE bezeichnet. Wenn ein Wort nicht zu benannten Entitäten gehört, wird es mit OTHER gekennzeichnet. Da IREX acht NE-Klassen definiert, werden Wörter in 33 Kategorien eingeteilt.

    Jedes Sample wird durch 15 Features dargestellt, da jedes Wort drei Features hat (Tag des Sprechens, Zeichentyp und das Wort selbst), und Zwei vorangehende Wörter und zwei aufeinanderfolgende Wörter werden auch für die Kontextabhängigkeit von verwendet. Obwohl seltene Features in der Regel entfernt werden, um eine Überanpassung zu verhindern, werden alle Features verwendet, da SVMs robust sind. Jedes Sample wird durch einen langen Binärvektor dargestellt, dh eine Folge von 0 (falsch) und 1 ( wahr). Zum Beispiel wird "Bush" in dem obigen Beispiel durch einen Vektor x = x [1] ... x [D] dargestellt, der unten beschrieben wird. Nur 15 elements are 1.

    x[1] = 0 // Current word is not ‘Alice’ 
    x[2] = 1 // Current word is ‘Bush’ 
    x[3] = 0 // Current word is not ‘Charlie’
    
    x[15029] = 1 // Current POS is a proper noun 
    x[15030] = 0 // Current POS is not a verb
    
    x[39181] = 0 // Previous word is  nicht "Henry" 
     x [39182] = 1 // Das vorige Wort ist "Herbert 
      
    <|
    17 January 2016
    Brian Tompsett - 汤莱恩nv39
1 answer
  • Es gibt eine Reihe von Wörtern, in denen Lexikon erstellt wird.

    Grundsätzlich haben Sie eine Map aus (nicht seltenen) Wörtern im Trainingssatz erstellt zeigt an. Nehmen wir an, Sie haben 20.000 einzigartige Wörter in Ihrem Trainingssatz. Von jedem Wort im Trainingssatz haben Sie eine Zuordnung auf [0, 20000].

    Dann ist der Merkmalsvektor im Grunde eine Verkettung einiger sehr spärlicher Vektoren, die eine 1 haben einem bestimmten Wort und 19.999 Nullen und dann 1 für eine bestimmte POS und 50 anderen Nullen für nicht aktive POS. Dies wird im Allgemeinen als One-Hot-Codierung bezeichnet. http://en.wikipedia.org/wiki/One-hot

     def encode_word_feature(word, POStag, char_type, word_index_mapping, POS_index_mapping, char_type_index_mapping)):
      # it makes a lot of sense to use a sparsely encoded vector rather than dense list, but it's clearer this way
      ret = empty_vec(len(word_index_mapping) + len(POS_index_mapping) + len(char_type_index_mapping))
      so_far = 0
      ret[word_index_mapping[word] + so_far] = 1
      so_far += len(word_index_mapping)
      ret[POS_index_mapping[POStag] + so_far] = 1
      so_far += len(POS_index_mapping)
      ret[char_type_index_mapping[char_type] + so_far] = 1
      return ret
    
    def encode_context(context):
      return encode_word_feature(context.two_words_ago, context.two_pos_ago, context.two_char_types_ago, 
                 word_index_mapping, context_index_mapping, char_type_index_mapping) +
             encode_word_feature(context.one_word_ago, context.one_pos_ago, context.one_char_types_ago, 
                 word_index_mapping, context_index_mapping, char_type_index_mapping) + 
             # ... pattern is obvious
     

    Ihr Feature-Vektor hat also eine Größe von 100k mit ein wenig mehr für POS- und Char-Tags und ist fast ausschließlich Nullen, außer für 15 1s in Positionen, die gemäß Ihrer Funktion ausgewählt wurden, um Zuordnungen zu indizieren.

    22 November 2011
    Rob Neuhaus