[PYTHON] Visualisez les réclamations avec l'IA

0. point

    1. La portée du droit de brevet est exprimée en mots sous forme de revendication.
  1. La description de la revendication étant stricte, la structure de la phrase est souvent compliquée et peut être mal comprise par certains lecteurs.
    1. J'ai essayé de visualiser les revendications afin qu'il n'y ait pas de divergence dans la reconnaissance entre l'inventeur, l'avocat et l'examinateur. (L'image ci-dessous fait partie de la visualisation.)

pic.png

1. 1. Contexte

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.

2. Préparation

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

3. 3. Traitement de l'information

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)

4. Défi à la visualisation

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é.

pic.png

Comment c'est? Je pense qu'il est plus facile de penser à quel genre d'étape il s'agit.

5. finalement

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

Visualisez les réclamations avec l'IA
Visualisez rapidement avec les pandas
3. 3. Programmation IA avec Python
Visualisez le nem 2019 avec WordCloud
Visualisons le fil 2ch avec WordCloud-Scraping-
Créez Puyopuyo AI avec Python
Visualisez les informations de localisation avec Basemap
Visualisons la connaissance de Wikidata avec Neo4j
Visualisez l'arbre de décision avec le notebook Jupyter
Faisons l'IA d'Othello avec Chainer-Part 1-
Visualisez les dépendances des packages python avec graphviz
Faisons l'IA d'Othello avec Chainer-Part 2-
Écrire Reversi AI avec Keras + DQN
[Épisode 2] Les débutants ont essayé Numeron AI avec python
J'ai essayé de visualiser AutoEncoder avec TensorFlow
[Épisode 3] Les débutants ont essayé Numeron AI avec python
[Facile] Reconnaissance automatique AI avec une webcam!
Détection des crues des rivières avec IA (classification ternaire)
[Épisode 0] Un débutant a essayé Numeron AI avec python
Essayez rapidement de visualiser votre ensemble de données avec des pandas
[Épisode 1] Un débutant a essayé Numeron AI avec python
Visualisons le fil 2ch avec WordCloud-analyse morphologique / édition WordCloud-
Visualisez le point P qui fonctionne avec Python
Faisons une IA à trois yeux avec Pylearn 2
Construction d'environnement AI / Machine Learning avec Python
Visualisez l'arbre de décision scikit-learn avec Treemap de Plotly