2017-06-05 1 views
7

Also als ein kleines Gedankenexperiment habe ich eine Funktion in Python programmiert, die spacy verwendet, um das Thema eines Nachrichtenartikels zu finden, und dann durch ein Nomen der Wahl zu ersetzen. Das Problem ist, dass es nicht gerade gut funktioniert, und ich hatte gehofft, es könnte verbessert werden. Ich verstehe SpaCy nicht so gut, und die Dokumentation ist ein bisschen schwer zu verstehen.Verwenden von spaCy, um das "Thema" eines Satzes zu ersetzen

Zuerst wird der Code:

doc=nlp(thetitle) 
for text in doc: 
    #subject would be 
    if text.dep_ == "nsubj": 
     subject = text.orth_ 
    #iobj for indirect object 
    if text.dep_ == "iobj": 
     indirect_object = text.orth_ 
     #dobj for direct object 
    if text.dep_ == "dobj": 
     direct_object = text.orth_ 
try: 
    subject 
except NameError: 
    if not thetitle: #if empty title 
     thetitle = "cat" 
     subject = "cat" 
    else: #if unknown subject 
     try: #do we have a direct object? 
      direct_object 
     except NameError: 
      try: #do we have an indirect object? 
       indirect_object 
      except NameError: #still no?? 
       subject = random.choice(thetitle.split()) 
      else: 
       subject = indirect_object 
     else: 
      subject = direct_object 
else: 
    thecat = "cat" #do nothing here, everything went okay 
newtitle = re.sub(r"\b%s\b" % subject, toreplace, thetitle) 
if (newtitle == thetitle) : #if no replacement happened due to regex 
    newtitle = thetitle.replace(subject, toreplace) 
return newtitle 

die "Katze" Linien sind Füllstoff Linien, die nichts tun. "thetitle" ist eine Variable für einen zufälligen News-Artikel, den ich aus RSS-Feeds ziehe. "tereplace" ist die Variable, die die Zeichenfolge enthält, die das gefundene Subjekt ersetzen soll.

Nehmen wir ein Beispiel verwenden:

„Video-Spiele, die TV animiert werden sollten Zeigt - Bildschirm Rant“ Und hier ist der displaCy Zusammenbruch dass: https://demos.explosion.ai/displacy/?text=Video%20Games%20that%20Should%20Be%20Animated%20TV%20Shows%20-%20Screen%20Rant&model=en&cpu=1&cph=1

Das Wort der Code beendet zu ersetzen entschied sich für sein " das ", was in diesem Satz nicht einmal ein Substantiv ist, sondern anscheinend zu einem zufälligen Wortwahl-Fallback geführt hat, da es kein Subjekt, indirektes Objekt oder direktes Objekt finden konnte. Ich hoffe, dass es in diesem Beispiel eher "Videospiele" finden würde.

Ich sollte beachten, wenn ich das letzte Stück heraus nehme (das scheint, die Quelle für den Nachrichtenartikel zu sein) in Anzeige: https://demos.explosion.ai/displacy/?text=Video%20Games%20that%20Should%20Be%20Animated%20TV%20Shows&model=en&cpu=1&cph=1 es scheint, dass "das" das Thema ist, das falsch ist.

Was ist eine bessere Möglichkeit, dies zu analysieren? Soll ich zuerst nach Eigennamen suchen?

+0

Dieser Versuch/ausgenommen Blöcke sehen nicht sehr Pythonic, was ist falsch mit der Initialisierung sie auf keine und dann überprüfen? –

+0

Sie werden keine guten Ergebnisse für Satzfragmente sehen, Ihr Beispielsatz hat nicht einmal ein Prädikat. –

+0

Re: die try/except Blöcke Ich habe dies von einem Codebeispiel abgeleitet, das ich für die Verwendung von SpaCy gefunden habe. Wäre ein Prädikat nicht schlecht? Gibt es einen besseren Weg, das Thema eines Satzfragments zu finden als mit SpaCy? – SpaceMouse

Antwort

1

Nicht direkt auf Ihre Frage, ich denke, der Code unten ist viel besser lesbar, weil die Bedingungen explizit sind, und was passiert, wenn eine Bedingung gültig ist nicht in einer else Klausel weit entfernt begraben. Dieser Code kümmert sich auch um die Fälle mit mehreren Objekten.

Zu Ihrem Problem: jede natürliche Sprache Verarbeitung Werkzeug wird es schwer haben, das Thema (oder vielleicht eher Thema) eines Satzfragments zu finden, sie sind mit vollständigen Sätzen trainiert. Ich bin mir nicht einmal sicher, ob solche Fragmente technisch Themen haben (ich bin kein Experte). Du könntest versuchen, dein eigenes Modell zu trainieren, aber dann wirst du beschriftete Sätze liefern müssen, ich weiß nicht, ob so etwas für Satzfragmente bereits existiert.

Ich bin mir nicht ganz sicher, was Sie erreichen wollen, wenn Sie die allgemeinen Substantive und Pronomen betrachten, enthält sie wahrscheinlich das Wort, das Sie ersetzen möchten, und das erste, das erscheint, ist wahrscheinlich das Wichtigste.

Verwandte Themen