Les droits de propriété intellectuelle, en particulier les droits de brevet, sont des armes puissantes qui ouvrent une nouvelle ère. La validité du droit de brevet est définie par le texte (revendication) décrit dans "Portée de la revendication". Bien entendu, chaque revendication est rédigée de manière stricte de sorte que les éléments du droit de brevet soient "nécessaires" et "suffisants", de sorte que la structure de la phrase est souvent compliquée. Par exemple, la "portée de la revendication" du brevet déposé par Toyota pour la conduite automatique ("Reconnaissance de situation de trafic pour les véhicules autonomes", JP2018198422A) est la suivante (extrait).
JP2018198422A.txt
Une étape d'acquisition consistant à acquérir des données de capteur obtenues en détectant l'environnement externe du véhicule à partir d'un capteur externe prévu dans le véhicule, et
Une étape d'identification qui analyse les données du capteur pour identifier les conditions de circulation à l'extérieur du véhicule,
Une étape de génération pour générer des données graphiques pour afficher un retour visuel qui décrit visuellement les informations sur la situation du trafic, et
Une étape de transmission consistant à transmettre les données graphiques au dispositif d'interface afin d'afficher le retour visuel sur le dispositif d'interface.
Y compris les méthodes.
Savez-vous ce que vous dites? Quand je l'ai lu pour la première fois, honnêtement, je n'ai pas vraiment compris ce que c'était (rires). Après relecture, j'ai trouvé deux points: (1) c'est un brevet lié à la méthode, et (2) la méthode comprend quatre étapes. Honnêtement, même si je lis les détails de chaque étape, j'ai l'impression "Je ne peux pas l'obtenir tout de suite". Bien sûr, ce n'est pas l'invention qui est mauvaise, c'est mon esprit (rires). Sur la base d'une telle situation, j'ai essayé de voir si la réclamation pouvait être visualisée.
Maintenant, pour la visualisation, j'utilise Python, qui peut être considéré comme le langage standard de l'IA. Cette fois, nous utiliserons Cabocha, en considérant la structure du texte comme une dépendance. Tout d'abord, la préparation, MeCab, CRF ++, Cabocha sont nécessaires. Il existe un très bon article sur la façon de l'installer, veuillez donc vous y référer. Je l'ai également utilisé comme référence. Nous aimerions profiter de cette occasion pour remercier les créateurs du site. La meilleure façon d'utiliser MeCab et CaboCha avec Google Colab [▲ 100 coups de traitement du langage sans déception == Préparation du chapitre 5 ==](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)
Si MeCab pour l'analyse morphologique peut être installé correctement, ce sera comme suit.
import MeCab
tagger = MeCab.Tagger()
print(tagger.parse("Le client d'à côté est un client qui mange souvent des kakis"))
output
Voisin Tonari Tonari Voisin Noun-Nomenclature commune-Général 0
L'assistant de Nono-Assistant de cas
Client Cuck Cuck Client Nominal-Nomenclature commune-Général 0
Waha est un assistant-Assistance
Eh bien Yoku Yoku Well Advocate 1
Kaki kaki kaki kaki substantif-Nomenclature commune-Général 0
Eat Kuku Eat Verbe-Général 5e dan-Type d'unité de ligne Wah-Général 1
Client Cuck Cuck Client Nominal-Nomenclature commune-Général 0
Dada Dada Verbe auxiliaire Verbe auxiliaire-Type de terminaison Da-Général
EOS
De plus, si CRF ++ et Cabocha requis pour l'analyse des dépendances sont installés correctement, ce sera comme suit.
import CaboCha
cp = CaboCha.Parser()
print(cp.parseToString("Le client d'à côté est un client qui mange souvent des kakis"))
output
à côté de-D
Les clients-------D
Souvent---D |
kaki-D |
Manger-D
C'est un client
EOS
Maintenant que l'installation est terminée, traitons les données. Tout d'abord, les données de texte préparées sont lues et une analyse morphologique est effectuée pour chaque ligne. Utilisez ensuite Cabocha pour effectuer une analyse des dépendances.
file_path = 'JP2018198422A.txt'
#Préparer une liste vide
c_list = []
c = CaboCha.Parser()
#Lire des données textuelles
with open(file_path) as f:
text_list = f.read()
#L'analyse morphologique est effectuée pour chaque ligne en séparant avec un saut de ligne.
for i in text_list.split('\n'):
cabo = c.parse(i)
#Préparé c_Stocker dans la liste.
c_list.append(cabo.toString(CaboCha.FORMAT_LATTICE))
Le résultat est enregistré dans un fichier et le traitement des données est terminé.
#Exportation
path_w = 'JP2018198422A.txt.cabocha'
#Écrits lors de l'écriture d'un type de liste()
with open(path_w, mode='w') as f:
f.writelines(c_list)
Puis, enfin, nous mettrons au défi la visualisation. Tout d'abord, lisez le résultat de l'analyse des dépendances.
#Lecture des données de résultat de l'analyse des dépendances
path = 'JP2018198422A.txt.cabocha'
import re
with open(path, encoding='utf-8') as f:
_data = f.read().split('\n')
Ensuite, implémentez la classe Morph qui représente la morphologie. Cette classe a une forme de surface (surface), une forme de base (base), un mot de partie (pos) et une sous-classification de mot de partie 1 (pos1) en tant que variables membres.
class Morph:
def __init__(self, word):
self.surface = word[0]
self.base = word[7]
self.pos = word[1]
self.pos1 = word[2]
#Une liste de phrases
sent = []
#Stockage temporaire pour la liste à envoyer
temp = []
for line in _data[:-1]:
#Divisez chaque élément de la liste.
#ensemble[]alors"\t "et","Quand"(espace)".
text = re.split("[\t, ]", line)
#Utilisez «EOS» comme guide pour lister chaque phrase.
if text[0] == 'EOS':
sent.append(temp)
#Vide pour une utilisation dans l'instruction suivante.
temp = []
#La ligne d'analyse des dépendances est inutile cette fois, alors continuez
elif text[0] == '*':
continue
#Stocke l'élément spécifié à partir du résultat de l'analyse morphologique dans temp sous la forme d'une liste d'objets Morph.
else:
morph = Morph(text)
temp.append(morph)
Ensuite, implémentez la clause Chunk class. Cette classe contient une liste d'éléments morph (objets Morph) (morphs), une liste de numéros d'index de clause associés (dst) et une liste de numéros d'index de clause d'origine (srcs) associés en tant que variables membres.
#Chunk de classe
class Chunk:
def __init__(self, idx, dst):
self.idx = idx #Numéro de phrase
self.morphs = [] #Liste des éléments morphologiques (objets Morph)
self.dst = dst #Numéro d'index de la clause de contact
self.srcs = [] #Liste des numéros d'index des clauses d'origine
import re
#Liste par phrase
s_list = []
#Objet Chunk
sent = []
#Liste des objets Morph des résultats de l'analyse morphologique
temp = []
chunk = None
for line in _data[:-1]:
#ensemble[]alors"\t "et","Quand"(espace)Spécifiez le délimiteur.
text = re.split("[\t, ]", line)
#Traitement des lignes pour l'analyse des dépendances
if text[0] == '*':
idx = int(text[1])
dst = int(re.search(r'(.*?)D', text[2]).group(1))
#To Chunk object
chunk = Chunk(idx, dst)
sent.append(chunk)
#Liste par phrase en utilisant EOS comme repère
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)
#Affichage de la première ligne
for m in s_list[0]:
print(m.idx, [mo.surface for mo in m.morphs], 'Personne en charge:' + str(m.srcs),'Contact:' + str(m.dst))
output
0 ['véhicule', 'À']Personne en charge:[]Personne de contact: 1
1 ['Préparer', 'Être', 'Ta']Personne en charge:[0]Contact: 2
2 ['Externe', 'Capteur', 'De', '、']Personne en charge:[1]Contact: 8
3 ['M'a dit', 'véhicule', 'de']Personne en charge:[]Contact: 4
4 ['Externe', 'environnement', 'À']Personne en charge:[3]Contact: 5
5 ['Détection', 'Shi', 'main']Personne en charge:[4]Contact: 6
6 ['Gain', 'Être', 'Ta']Personne en charge:[5]Contact: 7
7 ['Données du capteur', 'À']Personne en charge:[6]Contact: 8
8 ['Avoir', 'Faire']Personne en charge:[2, 7]Contact: 9
9 ['Avoir', 'Étape', 'Quand', '、']Personne en charge:[8]Contact:-1
De plus, le texte de la clause d'origine et de la clause associée est extrait.
for s in s_list:
for m in s:
#Dans le cas d'une clause avec un contact
if int(m.dst) != -1:
#La pos du résultat de l'analyse morphologique est'symbole'Les éléments autres que sont affichés séparés par des tabulations r.
print(''.join([b.surface if b.pos != 'symbole' else '' for b in m.morphs]),
''.join([b.surface if b.pos != 'symbole' else '' for b in s[int(m.dst)].morphs]), sep='\t')
output
Équipé dans le véhicule
Fourni à partir d'un capteur externe
Obtenu à partir d'un capteur externe
L'environnement extérieur du véhicule
Détecter l'environnement extérieur
Obtenu par détection
Données de capteur obtenues
Acquérir les données du capteur
Étape d'acquisition et étape d'acquisition
Analyser les données du capteur
Analyser et identifier
À l'extérieur du véhicule
Conditions de circulation externes
Identifier les conditions de circulation
Identification avec étape d'identification
Informations sur la situation du trafic
Représenter des informations
Représenter visuellement
Représenter une rétroaction visuelle
Afficher un retour visuel
Afficher
Données graphiques pour
Générer des données graphiques
Générer avec l'étape de génération
Affichage sur le périphérique d'interface
Afficher le retour visuel
Afficher
Pour l'étape de transmission et
Envoyer les données graphiques
Envoyer vers le périphérique d'interface
Envoyer avec l'étape d'envoi
comprenant
Comment inclure
Enfin, l'arbre dépendant est visualisé sous forme de graphe orienté. Donnez la priorité à la visibilité et ne visualisez que la première étape.
#Je vais essayer la première partie
v = s_list[0]
#Créer une liste pour stocker un ensemble de clauses
s_pairs = []
for m in v:
if int(m.dst) != -1:
a = ''.join([b.surface if b.pos != 'symbole' else '' for b in m.morphs])
b = ''.join([b.surface if b.pos != 'symbole' else '' for b in v[int(m.dst)].morphs])
c = a, b
s_pairs.append(c)
#Dessin de l'arbre dépendant
import pydot_ng as pydot
img = pydot.Dot(graph_type='digraph')
#Spécifiez une police prenant en charge le japonais
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')
Le produit fini est comme ci-dessous. Identique au premier, mais republié.
Comment c'est? Je pense qu'il est plus facile de penser à quel genre d'étape il s'agit.
Pour être honnête, j'ai été surpris quand j'ai appris que les droits de brevet sont essentiellement déterminés par les mots. Bien entendu, les dessins sont également des documents importants, mais le fait qu'ils deviennent ou non des brevets et la détermination de l'étendue des droits sont directement exprimés par des mots. Compte tenu de ces faits, je pense qu'il est très important de visualiser la structure de la phrase.
Le statut du brevet de conduite automatique de Toyota utilisé dans l'exemple est en attente. Il est difficile d'obtenir un brevet.
Pour la coordination, je me suis référé au site suivant. C'était un très bon site et j'ai beaucoup appris. Nous aimerions profiter de cette occasion pour vous remercier. [▲ 100 coups de traitement du langage sans déception == 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