Rechte an geistigem Eigentum, insbesondere Patentrechte, sind mächtige Waffen, die eine neue Ära eröffnen. Die Gültigkeit des Patentrechts wird durch den in "Umfang des Anspruchs" beschriebenen Text (Anspruch) definiert. Selbstverständlich ist jeder Anspruch streng geschrieben, so dass die Bestandteile des Patentrechts "notwendig" und "ausreichend" sind, so dass die Satzstruktur häufig kompliziert ist. Beispielsweise ist der "Anspruchsumfang" des von Toyota für das automatische Fahren eingereichten Patents ("Verkehrssituationserkennung für autonome Fahrzeuge", JP2018198422A) wie folgt (Auszug).
JP2018198422A.txt
Ein Erfassungsschritt zum Erfassen von Sensordaten, die durch Erfassen der äußeren Umgebung des Fahrzeugs von einem im Fahrzeug bereitgestellten externen Sensor erhalten werden, und
Ein Identifikationsschritt, der die Sensordaten analysiert, um die Verkehrsbedingungen außerhalb des Fahrzeugs zu identifizieren.
Ein Generierungsschritt zum Generieren von Grafikdaten zum Anzeigen von visuellem Feedback, das die Informationen über die Verkehrssituation visuell beschreibt, und
Ein Übertragungsschritt zum Übertragen der Grafikdaten an das Schnittstellengerät, um die visuelle Rückmeldung auf dem Schnittstellengerät anzuzeigen.
Einschließlich Methoden.
Weißt du was du sagst? Als ich es zum ersten Mal las, verstand ich ehrlich gesagt nicht wirklich, was es war (lacht). Nach dem erneuten Lesen fand ich zwei Punkte: (1) Es handelt sich um ein Patent, das sich auf das Verfahren bezieht, und (2) das Verfahren umfasst vier Schritte. Ehrlich gesagt, selbst wenn ich die Details jedes Schritts lese, fühle ich mich wie "Ich kann es nicht sofort bekommen." Natürlich ist es nicht die Erfindung, die schlecht ist, es ist mein Verstand (lacht). Aufgrund einer solchen Situation habe ich versucht zu prüfen, ob die Behauptung visualisiert werden kann.
Zur Visualisierung verwende ich jetzt Python, die als Standardsprache der KI bezeichnet werden kann. Dieses Mal werden wir Cabocha verwenden, wobei wir die Struktur des Textes als Abhängigkeit betrachten. Zunächst sind Vorbereitung, MeCab, CRF ++, Cabocha erforderlich. Es gibt einen sehr guten Artikel zur Installation. Lesen Sie ihn daher. Ich habe es auch als Referenz verwendet. Wir möchten diese Gelegenheit nutzen, um den Erstellern der Website zu danken. Die stärkste Möglichkeit, MeCab und CaboCha mit Google Colab zu verwenden [▲ 100 Klopfen Sprachverarbeitung ohne Enttäuschung == Kapitel 5 Vorbereitung ==](https://ds-blog.tbtech.co.jp/entry/2020/06/08/%E2%96%B2%E5 % BF% 83% E3% 81% 8F% E3% 81% 98% E3% 81% 91% E3% 81% 9A% E8% A8% 80% E8% AA% 9E% E5% 87% A6% E7% 90 % 86100% E6% 9C% AC% E3% 83% 8E% E3% 83% 83% E3% 82% AF% EF% BC% 9D% EF% BC% 9D5% E7% AB% A0% E4% B8% 8B % E6% BA% 96% E5% 82% 99% EF% BC% 9D% EF% BC% 9D)
Wenn MeCab für die morphologische Analyse korrekt installiert werden kann, ist dies wie folgt.
import MeCab
tagger = MeCab.Tagger()
print(tagger.parse("Der Kunde nebenan ist ein Kunde, der oft Kakis isst"))
output
Nachbar Tonari Tonari Nachbar Nomen-Gemeinsame Nomenklatur-Allgemein 0
Nonos Assistent-Fallassistent
Customer Cuck Cuck Customer Nominal-Gemeinsame Nomenklatur-Allgemein 0
Waha ist ein Assistent-Hilfe
Gut Yoku Yoku Gut Anwalt 1
Kaki Kaki Kaki Kaki Nomen-Gemeinsame Nomenklatur-Allgemein 0
Eat Kuku Eat Verb-General 5. Dan-Typ der Wah-Leitungseinheit-Allgemeines 1
Customer Cuck Cuck Customer Nominal-Gemeinsame Nomenklatur-Allgemein 0
Dada Dada Hilfsverb Hilfsverb-Da Kündigungstyp-Allgemeines
EOS
Wenn CRF ++ und Cabocha, die für die Abhängigkeitsanalyse erforderlich sind, korrekt installiert sind, ist dies wie folgt.
import CaboCha
cp = CaboCha.Parser()
print(cp.parseToString("Der Kunde nebenan ist ein Kunde, der oft Kakis isst"))
output
neben an-D
Kunden-------D
Häufig---D |
Persimmon-D |
Essen-D
Es ist ein Kunde
EOS
Nachdem die Installation abgeschlossen ist, verarbeiten wir die Daten. Zunächst werden die vorbereiteten Textdaten gelesen und für jede Zeile eine morphologische Analyse durchgeführt. Verwenden Sie dann Cabocha, um eine Abhängigkeitsanalyse durchzuführen.
file_path = 'JP2018198422A.txt'
#Eine leere Liste vorbereiten
c_list = []
c = CaboCha.Parser()
#Textdaten lesen
with open(file_path) as f:
text_list = f.read()
#
for i in text_list.split('\n'):
cabo = c.parse(i)
#_
c_list.append(cabo.toString(CaboCha.FORMAT_LATTICE))
#
path_w = 'JP2018198422A.txt.cabocha'
#()
with open(path_w, mode='w') as f:
f.writelines(c_list)
Dann werden wir endlich die Visualisierung herausfordern. Lesen Sie zunächst das Ergebnis der Abhängigkeitsanalyse.
#Lesen der Ergebnisdaten der Abhängigkeitsanalyse
path = 'JP2018198422A.txt.cabocha'
import re
with open(path, encoding='utf-8') as f:
_data = f.read().split('\n')
Implementieren Sie als Nächstes die Klasse Morph, die die Morphologie darstellt. Diese Klasse hat eine Oberflächenform (Oberfläche), eine Basisform (Basis), ein Teilwort (pos) und eine Teilwortunterklassifikation 1 (pos1) als Elementvariablen.
class Morph:
def __init__(self, word):
self.surface = word[0]
self.base = word[7]
self.pos = word[1]
self.pos1 = word[2]
#Eine Liste von Sätzen
sent = []
#Temporärer Speicher für die zu sendende Liste
temp = []
for line in _data[:-1]:
#Teilen Sie jedes Element in der Liste.
#einstellen[]damit"\t "und","Wann"(Raum)".
text = re.split("[\t, ]", line)
#Verwenden Sie "EOS" als Leitfaden, um jeden Satz aufzulisten.
if text[0] == 'EOS':
sent.append(temp)
#Leer zur Verwendung in der nächsten Anweisung.
temp = []
#Die Zeile zur Abhängigkeitsanalyse ist diesmal nicht erforderlich. Fahren Sie also fort
elif text[0] == '*':
continue
#Speichert das angegebene Element aus dem Ergebnis der morphologischen Analyse in temp als Liste von Morph-Objekten.
else:
morph = Morph(text)
temp.append(morph)
Implementieren Sie dann die Klausel Chunk-Klasse. Diese Klasse enthält eine Liste von Morph-Elementen (Morph-Objekten) (Morphs), eine Liste verwandter Klauselindexnummern (dst) und eine Liste verwandter ursprünglicher Klauselindexnummern (srcs) als Mitgliedsvariablen.
#Klasse Chunk
class Chunk:
def __init__(self, idx, dst):
self.idx = idx #Phrasennummer
self.morphs = [] #Liste der morphologischen Elemente (Morph-Objekte)
self.dst = dst #Indexnummer der Kontaktklausel
self.srcs = [] #Liste der ursprünglichen Klauselindexnummern
import re
#Liste nach Satz
s_list = []
#Chunk-Objekt
sent = []
#Morph-Objektliste der morphologischen Analyseergebnisse
temp = []
chunk = None
for line in _data[:-1]:
#einstellen[]damit"\t "und","Wann"(Raum)Geben Sie das Trennzeichen an.
text = re.split("[\t, ]", line)
#Zeilen für die Abhängigkeitsanalyse verarbeiten
if text[0] == '*':
idx = int(text[1])
dst = int(re.search(r'(.*?)D', text[2]).group(1))
#Zum Chunk-Objekt
chunk = Chunk(idx, dst)
sent.append(chunk)
#Liste nach Satz mit EOS als Orientierungspunkt
elif text[0] == 'EOS':
if sent:
for i, c in enumerate(sent, 0):
if c.dst == -1:
continue
else:
sent[c.dst].srcs.append(i)
s_list.append(sent)
sent = []
else:
morph = Morph(text)
chunk.morphs.append(morph)
temp.append(morph)
#Anzeige der ersten Zeile
for m in s_list[0]:
print(m.idx, [mo.surface for mo in m.morphs], 'Verantwortliche Person:' + str(m.srcs),'Gesprächspartner:' + str(m.dst))
output
0 ['Fahrzeug', 'Zu']Verantwortliche Person:[]Ansprechpartner: 1
1 ['Bereiten', 'Sein', 'Ta']Verantwortliche Person:[0]Kontakt: 2
2 ['Extern', 'Sensor', 'Von', '、']Verantwortliche Person:[1]Kontakt: 8
3 ['Sagte', 'Fahrzeug', 'von']Verantwortliche Person:[]Kontakt: 4
4 ['Extern', 'Umgebung', 'Zu']Verantwortliche Person:[3]Kontakt: 5
5 ['Wahrnehmung', 'Shi', 'Hand']Verantwortliche Person:[4]Kontakt: 6
6 ['Dazugewinnen', 'Sein', 'Ta']Verantwortliche Person:[5]Kontakt: 7
7 ['Sensordaten', 'Zu']Verantwortliche Person:[6]Kontakt: 8
8 ['Erhalten', 'Machen']Verantwortliche Person:[2, 7]Kontakt: 9
9 ['Erhalten', 'Schritt', 'Wann', '、']Verantwortliche Person:[8]Gesprächspartner:-1
Außerdem wird der Text der ursprünglichen Klausel und der zugehörigen Klausel extrahiert.
for s in s_list:
for m in s:
#Im Falle einer Klausel mit einem Kontakt
if int(m.dst) != -1:
#Die Position des morphologischen Analyseergebnisses ist'Symbol'Andere Elemente als werden durch r Registerkarten getrennt angezeigt.
print(''.join([b.surface if b.pos != 'Symbol' else '' for b in m.morphs]),
''.join([b.surface if b.pos != 'Symbol' else '' for b in s[int(m.dst)].morphs]), sep='\t')
output
Im Fahrzeug ausgerüstet
Wird von einem externen Sensor bereitgestellt
Von einem externen Sensor bezogen
Die äußere Umgebung des Fahrzeugs
Wahrnehmung der äußeren Umgebung
Erhalten durch Erfassen
Erhaltene Sensordaten
Sensordaten erfassen
Akquisitionsschritt und Akquisitionsschritt
Analysieren Sie die Sensordaten
Analysieren und identifizieren
Außerhalb des Fahrzeugs
Externe Verkehrsbedingungen
Verkehrsbedingungen identifizieren
Identifikation mit Identifikationsschritt
Informationen zur Verkehrssituation
Informationen darstellen
Visuell darstellen
Zeigen Sie visuelles Feedback
Visuelles Feedback anzeigen
Anzeigen
Grafikdaten für
Grafikdaten generieren
Generieren Sie mit dem Generierungsschritt
Anzeige auf dem Schnittstellengerät
Zeigen Sie das visuelle Feedback an
Anzeigen
Für den Übertragungsschritt und
Senden Sie die Grafikdaten
An das Schnittstellengerät senden
Senden Sie mit dem Sendeschritt
einschließlich
Wie man einschließt
Schließlich wird der abhängige Baum als gerichteter Graph dargestellt. Priorisieren Sie die Sichtbarkeit und visualisieren Sie nur den ersten Schritt.
#Ich werde den ersten Teil versuchen
v = s_list[0]
#Erstellen einer Liste zum Speichern einer Reihe von Klauseln
s_pairs = []
for m in v:
if int(m.dst) != -1:
a = ''.join([b.surface if b.pos != 'Symbol' else '' for b in m.morphs])
b = ''.join([b.surface if b.pos != 'Symbol' else '' for b in v[int(m.dst)].morphs])
c = a, b
s_pairs.append(c)
#Zeichnung des abhängigen Baumes
import pydot_ng as pydot
img = pydot.Dot(graph_type='digraph')
#Geben Sie eine Schriftart an, die Japanisch unterstützt
img.set_node_defaults(fontname='Meiryo UI', fontsize='12')
for s, t in s_pairs:
img.add_edge(pydot.Edge(s, t))
img.write_png('pic')
Das fertige Produkt ist wie folgt. Wie der erste, aber neu gepostet.
Wie ist das? Ich denke, es ist einfacher darüber nachzudenken, was für ein Schritt es ist.
Um ehrlich zu sein, war ich überrascht, als ich zum ersten Mal erfuhr, dass Patentrechte im Wesentlichen durch Worte bestimmt werden. Natürlich sind Zeichnungen auch wichtige Dokumente, aber ob sie patentiert werden oder nicht und die Bestimmung des Umfangs der Rechte wird direkt in Worten ausgedrückt. Angesichts dieser Tatsachen halte ich es für sehr wichtig, die Satzstruktur zu visualisieren.
Der Status des im Beispiel verwendeten Patents für automatisches Fahren von Toyota steht noch aus. Es ist schwer, ein Patent zu bekommen.
Zur Koordination habe ich auf die folgende Seite verwiesen. Es war eine sehr gute Seite und ich habe viel gelernt. Wir möchten diese Gelegenheit nutzen, um Ihnen zu danken. [▲ 100 Klopfen Sprachverarbeitung ohne Enttäuschung == 40-44 ==](https://ds-blog.tbtech.co.jp/entry/2020/06/12/%E2%96%B2%E5% BF% 83% E3% 81% 8F% E3% 81% 98% E3% 81% 91% E3% 81% 9A% E8% A8% 80% E8% AA% 9E% E5% 87% A6% E7% 90% 86100% E6% 9C% AC% E3% 83% 8E% E3% 83% 83% E3% 82% AF% EF% BC% 9D% EF% BC% 9D% EF% BC% 94% EF% BC% 90% EF% BD% 9E% EF% BC% 94% EF% BC% 94% EF% BC% 9D)
Recommended Posts