[PYTHON] 100 Sprachverarbeitung Knock-59: Analyse der S-Formel

Sprachverarbeitung 100 Klopfen 2015 ["Kapitel 6: Englische Textverarbeitung"](http: //www.cl.ecei) Dies ist die Aufzeichnung von 59. "Analyse der S-Gleichung" von .tohoku.ac.jp / nlp100 / # ch6). Erstellen Sie einen Parser in einem Format namens "S-Typ". Es hat mich zum ersten Mal an einen Parser denken lassen, aber es ist sehr tief. Dieses Klopfen dauerte sehr lange. Wenn ich fertig bin, sind es ungefähr 50 Zeilen, aber es gibt viel Raum für Effizienz. Dieses Mal habe ich die Effizienz aufgegeben und es so einfach wie möglich gemacht.

Referenzlink

Verknüpfung Bemerkungen
059.Analyse der S-Gleichung.ipynb Antwortprogramm GitHub Link
100 Klicks Amateur-Sprachverarbeitung:59 Kopieren Sie die Quelle vieler Quellteile und fügen Sie sie ein
Stanford Core NLP Beamter Schauen Sie sich zuerst die Stanford Core NLP-Seite an

Umgebung

Art Ausführung Inhalt
OS Ubuntu18.04.01 LTS Es läuft virtuell
pyenv 1.2.16 Ich benutze pyenv, weil ich manchmal mehrere Python-Umgebungen benutze
Python 3.8.1 python3 auf pyenv.8.Ich benutze 1
Pakete werden mit venv verwaltet
Stanford CoreNLP 3.9.2 Ich habe es vor einem Jahr installiert und erinnere mich nicht im Detail ...
Es war das Neueste auch nach einem Jahr, also habe ich es so benutzt, wie es war
openJDK 1.8.0_242 Ich habe das JDK, das installiert wurde, für andere Zwecke verwendet

Kapitel 6: Verarbeiten von englischem Text

Inhalt des Studiums

Ein Überblick über verschiedene grundlegende Technologien für die Verarbeitung natürlicher Sprache durch englische Textverarbeitung mit Stanford Core NLP.

Stanford Core NLP, Stemming, Teilwort-Tagging, Extraktion eindeutiger Ausdrücke, Co-Referenzanalyse, Abhängigkeitsanalyse, Klauselstrukturanalyse, S-Ausdruck

Inhalt anklopfen

Führen Sie die folgende Verarbeitung für den englischen Text durch (nlp.txt).

59. Analyse der S-Formel

Lesen Sie das Ergebnis der Phrasenstrukturanalyse von Stanford Core NLP (S-Formel) und zeigen Sie alle Nomenklaturphrasen (NP) im Satz an. Alle verschachtelten Nomenklaturen anzeigen.

Problemergänzung (über "S-Formel")

Gemäß Wikipedia "S Formel" die folgende Erklärung.

Eine formale Beschreibungsmethode für dichotomisierte oder Listenstrukturen, die in Lisp eingeführt und hauptsächlich in Lisp verwendet wird. S leitet sich vom Symbol ab.

Der Mechanismus zum Ausdrücken natürlicher Sprache mit "S-Ausdruck" ist in Stanford Parser und [Online-Testtool](http: / Es gibt auch /nlp.stanford.edu:8080/parser/). Es gab auch ein Paket, das "S-Ausdrücke" mit Python analysiert, aber es scheint, dass es nicht viel verwendet wird, also habe ich mein Bestes gegeben, indem ich es selbst gemacht habe.

Antworten

Antwortprogramm [059. Analyse von S formel.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/06.%E8%8B%B1%E8%AA%9E%E3%83%86% E3% 82% AD% E3% 82% B9% E3% 83% 88% E3% 81% AE% E5% 87% A6% E7% 90% 86 / 059.S% E5% BC% 8F% E3% 81% AE% E8% A7% A3% E6% 9E% 90.ipynb)

import re
import xml.etree.ElementTree as ET

reg_split = re.compile(r'''
                         (      #Gruppenstart
                         \(|\)  #Gruppe von geteilten Zeichen(Klammer starten oder Klammer beenden)
                         )      #Gruppenende
                         ''', re.VERBOSE)

def output_np(chunks): 
    depth = 1
    output = []

    for chunk in chunks:
        
        #Der Beginn der Klammern ist die Tiefe+1
        if chunk == '(':
            depth += 1

        #Das Ende der Klammer ist die Tiefe-1
        elif chunk == ')':
            depth -= 1
        else:
            
            #Teilen Sie das Ausgabeziel und fügen Sie es hinzu, wenn Sie eine Reihe von Textteilen und Texten verwenden
            sets = chunk.split(' ')
            if len(sets) == 2:
                output.append(sets[1])
        
        #Ausgabe, wenn die Tiefe 0 erreicht
        if depth == 0:
            print('\t', ' '.join(output))
            break

for parse in \
 ET.parse('./nlp.txt.xml').iterfind('./document/sentences/sentence/parse'):
    
    depth = 0
    print(parse.text)
    
    #Trennen und am Anfang und Ende der Klammern auflisten(Leere / leere Elemente ausschließen)
    chunks = [chunk.strip() for chunk in reg_split.split(parse.text) 
                if chunk.strip() != '']
        
    #Die Ausgabe beginnt, wenn Sie NP erreichen
    for i, chunk in enumerate(chunks):
        if chunk == 'NP':
            output_np(chunks[i+1:])

Kommentar beantworten

XML-Dateipfad

Es ist eine Zuordnung zwischen dem Pfad der folgenden XML-Datei und dem Ziel-S-Ausdruck. Der Inhalt des S-Ausdrucks ist im Tag "parse" enthalten.

Ausgabe 1. Ebene Zweites Level Drittes Level 4. Stufe 5. Stufe
S-Typ root document sentences sentence parse

Die XML-Datei lautet [GitHub](https://github.com/YoheiFukuhara/nlp100/blob/master/06.%E8%8B%B1%E8%AA%9E%E3%83%86%E3%82%AD% E3% 82% B9% E3% 83% 88% E3% 81% AE% E5% 87% A6% E7% 90% 86 / nlp.txt.xml).

xml:nlp.txt.xml(Auszug)


<root>
  <document>
    <docId>nlp.txt</docId>
    <sentences>
      <sentence id="1">

--Unterlassung--

        <parse>(ROOT (S (PP (IN As) (NP (JJ such))) (, ,) (NP (NN NLP)) (VP (VBZ is) (ADJP (VBN related) (PP (TO to) (NP (NP (DT the) (NN area)) (PP (IN of) (NP (JJ humani-computer) (NN interaction))))))) (. .))) </parse>

Lassen Sie uns die obige S-Formel einrücken, um die Anzeige zu erleichtern. Es ist ein relativ kurzer Satz, aber er ist immer noch lang ... Der Textteil des Teils, der von diesem NP (Nominalphrase) umgeben ist, wird kombiniert und ausgegeben.

(ROOT 
	(S 
		(PP 
			(IN As) 
			(NP 
				(JJ such)
			)
		) 
		(, ,) 
		(NP 
			(NN NLP)
		) 
		(VP 
			(VBZ is) 
			(ADJP 
				(VBN related) 
				(PP 
					(TO to) 
					(NP 
						(NP 
							(DT the) 
							(NN area)
						) 
						(PP 
							(IN of) 
							(NP 
								(JJ humani-computer) 
								(NN interaction)
							)
						)
					)
				)
			)
		) 
	(. .)
	)
)

Suchen Sie in der Hauptschleife nach NP

Hier wird XML gelesen, geloopt und nach NP gesucht. Die Liste wird durch reguläre Ausdrücke unterteilt, und obstruktive leere / leere Elemente werden ausgeschlossen. Und wenn NP kommt, nennen wir die Ausgabefunktion "output_np". Wenn NP von oben gefunden wird, wird es ausgegeben, aber im Fall von verschachteltem NP ist es ineffizient, weil es dieselbe Logik mehrmals durchläuft. Aber ich wollte es einfach halten, also lasse ich es ineffizient.

python


for parse in \
 ET.parse('./nlp.txt.xml').iterfind('./document/sentences/sentence/parse'):

    depth = 0
    print(parse.text)

    #Trennen und am Anfang und Ende der Klammern auflisten(Leere / leere Elemente ausschließen)
    chunks = [chunk.strip() for chunk in reg_split.split(parse.text) 
                if chunk.strip() != '']

    #Die Ausgabe beginnt, wenn Sie NP erreichen
    for i, chunk in enumerate(chunks):
        if chunk == 'NP':
            output_np(chunks[i+1:])

NP-Ausgangsabschnitt

Die Tiefe der S-Formel wird anhand des Anfangs und des Endes der Klammern beurteilt und ausgegeben, wenn der NP-Teil endet.

python


def output_np(chunks): 
    depth = 1
    output = []

    for chunk in chunks:

        #Der Beginn der Klammern ist die Tiefe+1
        if chunk == '(':
            depth += 1

        #Das Ende der Klammer ist die Tiefe-1
        elif chunk == ')':
            depth -= 1
        else:

            #Teilen Sie das Ausgabeziel und fügen Sie es hinzu, wenn Sie eine Reihe von Textteilen und Texten verwenden
            sets = chunk.split(' ')
            if len(sets) == 2:
                output.append(sets[1])

        #Ausgabe, wenn die Tiefe 0 erreicht
        if depth == 0:
            print('\t', ' '.join(output))
            break

Ausgabeergebnis (Ausführungsergebnis)

Wenn das Programm ausgeführt wird, wird das folgende Ergebnis ausgegeben (erster Auszug).

Ausgabeergebnis(Top Auszug)


(ROOT (S (PP (NP (JJ Natural) (NN language) (NN processing)) (IN From) (NP (NNP Wikipedia))) (, ,) (NP (NP (DT the) (JJ free) (NN encyclopedia) (JJ Natural) (NN language) (NN processing)) (PRN (-LRB- -LRB-) (NP (NN NLP)) (-RRB- -RRB-))) (VP (VBZ is) (NP (NP (NP (DT a) (NN field)) (PP (IN of) (NP (NN computer) (NN science)))) (, ,) (NP (JJ artificial) (NN intelligence)) (, ,) (CC and) (NP (NP (NNS linguistics)) (VP (VBN concerned) (PP (IN with) (NP (NP (DT the) (NNS interactions)) (PP (IN between) (NP (NP (NNS computers)) (CC and) (NP (JJ human) (-LRB- -LRB-) (JJ natural) (-RRB- -RRB-) (NNS languages)))))))))) (. .))) 
	 Natural language processing
	 Wikipedia
	 the free encyclopedia Natural language processing -LRB- NLP -RRB-
	 the free encyclopedia Natural language processing
	 NLP
	 a field of computer science , artificial intelligence , and linguistics concerned with the interactions between computers and human -LRB- natural -RRB- languages
	 a field of computer science
	 a field
	 computer science
	 artificial intelligence
	 linguistics concerned with the interactions between computers and human -LRB- natural -RRB- languages
	 linguistics
	 the interactions between computers and human -LRB- natural -RRB- languages
	 the interactions
	 computers and human -LRB- natural -RRB- languages
	 computers
	 human -LRB- natural -RRB- languages
(ROOT (S (PP (IN As) (NP (JJ such))) (, ,) (NP (NN NLP)) (VP (VBZ is) (ADJP (VBN related) (PP (TO to) (NP (NP (DT the) (NN area)) (PP (IN of) (NP (JJ humani-computer) (NN interaction))))))) (. .))) 
	 such
	 NLP
	 the area of humani-computer interaction
	 the area
	 humani-computer interaction
(ROOT (S (S (NP (NP (JJ Many) (NNS challenges)) (PP (IN in) (NP (NN NLP)))) (VP (VBP involve) (S (NP (NP (JJ natural) (NN language) (NN understanding)) (, ,) (SBAR (WHNP (WDT that)) (S (VP (VBZ is)))) (, ,)) (VP (VBG enabling) (NP (NNS computers)) (S (VP (TO to) (VP (VB derive) (NP (NN meaning)) (PP (IN from) (NP (ADJP (JJ human) (CC or) (JJ natural)) (NN language) (NN input)))))))))) (, ,) (CC and) (S (NP (NNS others)) (VP (VBP involve) (NP (JJ natural) (NN language) (NN generation)))) (. .))) 
	 Many challenges in NLP
	 Many challenges
	 NLP
	 natural language understanding , that is ,
	 natural language understanding
	 computers
	 meaning
	 human or natural language input
	 others
	 natural language generation

Recommended Posts

100 Sprachverarbeitung Knock-59: Analyse der S-Formel
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-56: Co-Referenz-Analyse
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)
100 Sprachverarbeitung Knock 2020 Kapitel 4: Morphologische Analyse
100 Sprachverarbeitungsklopfen (2020): 28
100 Sprachverarbeitung Knock Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 5: Abhängigkeitsanalyse
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
100 Language Processing Knock 2015 Kapitel 4 Morphologische Analyse (30-39)
100 Sprachverarbeitung Knock-91: Vorbereitung von Analogiedaten
Sprachverarbeitung 100 Knocks-44: Visualisierung abhängiger Bäume
100 Sprachverarbeitung Knock-26: Entfernen von hervorgehobenem Markup
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 17
100 Sprachverarbeitung Knock-52: Stemming
100 Sprachverarbeitung Knock Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 07
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
100 Amateur-Sprachverarbeitungsklopfen: 09
100 Amateur-Sprachverarbeitungsklopfen: 47
100 Sprachverarbeitung Knock-53: Tokenisierung
100 Amateur-Sprachverarbeitungsklopfen: 97
100 Sprachverarbeitung klopfen 2020 [00 ~ 59 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 67
100 Sprachverarbeitung Knock-32 (mit Pandas): Prototyp des Verbs
Sprachverarbeitung 100 Schläge-45: Extraktion von Verbfallmustern
100 Sprachverarbeitung Knock-75 (mit Scicit-Learn): Gewicht der Identität
100 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock-51: Wortausschnitt
100 Sprachverarbeitung Knock-50: Satzumbruch
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
Verarbeitung natürlicher Sprache 1 Morphologische Analyse
100 Sprachverarbeitung Knock-25: Vorlagenextraktion
Sprachverarbeitung 100 Knock-87: Wortähnlichkeit
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020
Lösen von 100 Sprachverarbeitungsklopfen 2020 (01. "Patatokukashi")
100 Amateur-Sprachverarbeitungsklopfen: Zusammenfassung
100 Sprachverarbeitung Knock-36 (unter Verwendung von Pandas): Häufigkeit des Auftretens von Wörtern
100 Sprachverarbeitung Knock-30 (unter Verwendung von Pandas): Lesen der Ergebnisse der morphologischen Analyse
Sprachverarbeitung 100 Schläge-49: Extraktion von Abhängigkeitspfaden zwischen Nomenklatur
Lernen Sie mit "Google Colaboratory" ganz einfach 100 Sprachverarbeitungsklopfen 2020.
100 Sprachverarbeitung Knock 2020 Kapitel 2: UNIX-Befehle
100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)
100 Sprachverarbeitung Knock Kapitel 1 in Python
100 Sprachverarbeitungsklopfen 2020: Kapitel 4 (morphologische Analyse)
[Sprachverarbeitung 100 Schläge 2020] Kapitel 5: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-76 (mit Scicit-Learn): Beschriftung
100 Sprachverarbeitung Knock-77 (mit Scicit-Learn): Messung der korrekten Antwortrate
100 Sprachverarbeitungsklopfen mit Python (Kapitel 3)
100 Sprachverarbeitungsklopfen: Kapitel 1 Vorbereitungsbewegung
100 Sprachverarbeitung Knock 2020 Kapitel 10: Maschinelle Übersetzung (90-98)
100 Sprachverarbeitung Knock-42: Anzeige der Phrase der betroffenen Person und der betroffenen Person
Sprachverarbeitung 100 Knocks-29: Holen Sie sich die URL des Flaggenbildes