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.
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 |
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 |
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
Führen Sie die folgende Verarbeitung für den englischen Text durch (nlp.txt).
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.
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.
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:])
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)
)
)
)
)
)
)
(. .)
)
)
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:])
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
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