[Analyse des brevets] J'ai essayé de créer une carte des brevets avec Python sans dépenser d'argent

introduction

J'ai pensé que je devrais essayer l'analyse des brevets en même temps, alors j'ai décidé de l'essayer. Plus précisément, en ce qui concerne l'analyse des brevets, par exemple, il y a un graphique comme celui ci-dessous. patentmap_search_bubblechart.gif (La figure est tirée du Manuel J-STORE) L'axe vertical montre le demandeur de brevet, l'axe horizontal montre l'année de délivrance du brevet et la taille du cercle indique le nombre de brevets, ce que l'on appelle un graphique à bulles. Il y a quelque chose dans le monde qui fera un tel complot moyennant des frais.

Cette fois-ci, en recherchant les documents de brevet à l'aide de la base de données de brevets gratuite J-PlatPat et en traitant les résultats en Python. Je voudrais faire un complot comme celui-ci.

Qu'est-ce que J-PlatPat?

Selon wikipedia,

La plateforme d'information sur les brevets (plateforme japonaise pour l'information sur les brevets) est liée aux droits de propriété industrielle tels que les brevets, les nouvelles idées pratiques, les dessins et les marques de commerce exploités par le Centre d'information et de formation sur la propriété industrielle de l'Agence administrative incorporée (INPIT). Il s'agit d'une base de données qui vous permet de rechercher et de vous renseigner gratuitement sur les bulletins de propriété industrielle, etc.

... Apparemment ... L'important ici est que son utilisation ne coûte pas d'argent, mais il existe de nombreuses restrictions quant à sa gratuité et vous risquez de vous indigner si vous la touchez facilement.

Cette fois, la stratégie de cette plateforme est de moitié, et l'explication du traitement des données obtenues est de moitié.

Collecte de données

Je suis intéressé par les batteries, en particulier les batteries dites secondaires qui peuvent être chargées et déchargées, je voudrais donc rechercher cela.

Cependant, si vous recherchez normalement "batterie", par exemple, les cellules solaires et les piles à combustible seront également recherchées. Jusqu'à présent, cela se produit même avec une recherche normale.

Tout en sollicitant la haine pour l'humanité qui a traduit la cellule solaire et la pile à combustible par "batterie", entrez ce qui suit dans le brevet de J-PlatPat / recherche de nouvelles idées pratiques => entrée d'expression logique.

pat1.png

Cette / TI indique le titre, auquel cas les brevets qui incluent «batterie secondaire» ou «batterie de stockage» dans le titre du brevet seront recherchés. Si vous utilisez une expression logique, vous pouvez spécifier diverses autres choses afin que le monde s'agrandisse. Pour plus de détails, reportez-vous à Aide de J-PlatPat.

Cette désignation donnera lieu à 60459 brevets. Cependant, le nombre maximum de résultats de recherche J-PlatPat affichés est de 3000, vous mourrez donc. Recherchez donc en spécifiant la date d'émission.

pat2.png

La date d'émission est spécifiée par l'option de recherche et non par l'expression logique. Dans ce cas, les brevets délivrés pendant la période d'un an du 1er janvier 2019 au 1er janvier 2020 seront affichés.

Vous pouvez maintenant voir 1408 brevets comme indiqué ci-dessous (au 2/4/2020).

pat3.png

J'aimerais analyser le contenu du brevet au cas par cas, mais c'est interdit (voir Notes). Ne fais jamais ça. Je pense que vous devriez me pardonner avec la "sortie CSV" dans la liste. Appuyez dessus.

Pour produire du CSV, réduisez à 100 ou moins.

Oui je suis mort. Ceci est la fin de cet article. Est un mensonge. Ne vous précipitez pas, appuyez sur "Imprimer la liste".

pat4.png

Ensuite, la fenêtre "Imprimer la liste | J-PlatPat [JPP]" apparaîtra comme indiqué ci-dessus. Cet écran contient les 1408 brevets. Cliquez avec le bouton droit de la souris et enregistrez le fichier HTML au lieu de l'imprimer. Ceci termine l'acquisition des données de brevets pour 2019.

Après cela, tout en décalant l'année d'émission de manière appropriée, nous allons acquérir manuellement le HTML de la liste des brevets, comme 2018, 2017 .... Cette fois, nous avons acquis des données sur 15 ans de 2005 à 2019.

C'est un travail qui semble vide, mais ce n'est en fait pas si compliqué, et cela ne prend qu'environ 10 minutes.

Convertir du HTML au CSV

Avec BeautifulSoup de Python, il est facile de convertir le contenu d'un tableau HTML en CSV.

Un peu comme ci-dessous. Lisez les fichiers HTML à partir de ./html et écrivez des fichiers CSV dans ./csv.


from bs4 import BeautifulSoup
import re
import glob
import pandas as pd

path = glob.glob('./html/*.html')

for p in path:
    
    name = p.replace('.html','').replace('./html\\','')  
    html = open(p,'r',encoding="utf-8_sig")
    soup = BeautifulSoup(html,"html.parser")
    
    tr = soup.find_all('tr')
    columns = [i.text.replace('\n','') for i in tr[0].find_all('th')]
    
    df = pd.DataFrame(index=[],columns=columns[1:])
    
    for l in tr[1:]:
        lines = [i.text for i in l.find_all('td')]
        lines = [i.replace('\n','') if n != 6 else re.sub(r'[\n]+', ",", i)  for n,i in enumerate(lines)]
        lines = pd.Series(lines, index=df.columns)
        df = df.append(lines,ignore_index=True)
    
    df.to_csv('./csv/'+name+'.csv', encoding='utf_8_sig', index=False)

Je n'accède pas du tout à J-PlatPat car je ne fais que traiter manuellement le fichier HTML enregistré localement. C'est sur.

Une partie de la trame de données obtenue est représentée ci-dessous (brevet2005.csv). 15 CSV comme celui-ci seront enregistrés de 2005 à 2019. ~~ Ce n'est pas nécessaire si J-PlatPat prend en charge toutes les sorties CSV ~~

Numéro de réference numéro d'application Date de dépôt Date connue Titre de l'invention demandeur/Titulaire droit FI
Re-table 2005/124920 Demande de brevet japonais n ° 2006-514740 2005/06/14 2005/12/29 Batterie de stockage au plomb Panasonic Corporation ,C22C11/00,C22C11/02,C22C11/06,autre,
Re-table 2005/124899 Demande de brevet japonais n ° 2006-514659 2005/03/09 2005/12/29 Batterie secondaire et sa méthode de fabrication Panasonic Corporation ,H01M2/16@M,H01M4/02@B,H01M4/02@Z,autre,
Re-table 2005/124898 Demande de brevet japonais n ° 2006-514732 2005/06/13 2005/12/29 Poudre de matière active positive pour batterie secondaire au lithium AGC Seimi Chemical Co., Ltd. ,H01M4/02@C,H01M4/36@E,H01M4/36,autre,
Re-table 2005/122318 Demande de brevet japonais n ° 2006-514434 2005/05/18 2005/12/22 Électrolyte non aqueux et batterie secondaire au lithium l'utilisant Ube Kosan Co., Ltd. ,H01M4/02@C,H01M4/02@D,H01M4/36,autre,
Demande de brevet japonais mise à l'inspection publique n ° 2005-353584 Demande de brevet japonais 2005-140521 2005/05/13 2005/12/22 Batterie secondaire au lithium-ion et sa méthode de fabrication Panasonic Co., Ltd. et autres ,H01M2/16@P,H01M4/02,101,H01M4/02,108,autre,

Créer un graphique à bulles

Lors de la création d'un graphique à bulles, il y a le problème de savoir comment sélectionner le candidat cible (entreprise). Cette fois, si nous attirons les 10 premières entreprises avec le nombre de demandes de brevet chaque année, nous n'avons que 30 entreprises, alors nous le ferons.

Organisez vos données comme suit:

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import glob
import pandas as pd
import collections
import numpy as np
import seaborn as sns

path = glob.glob('./csv/*.csv')

app_top10_dic = {} #TOP10 entreprises et nombre de candidatures pour chaque année
app_total_dic = {} #Toutes les entreprises et nombre de candidatures chaque année
app_all = [] #Liste des entreprises soumises au graphique à bulles
for p in path:
    name = p.replace('.csv',' ').replace('./csv\\patent','').replace(' ','')
    df = pd.read_csv(p)
    app_list = df['demandeur/Titulaire droit']
    app_list = [i.rstrip('autre').replace(' ','').replace('\u3000',' ') for i in app_list]
    app_set = collections.Counter(app_list)
    app_top10 = app_set.most_common()[:10]
    app_all.extend([i[0] for i in app_top10])
    app_top10_dic[name] = app_top10
    
    app_total = app_set.most_common()
    app_total_dic[name] = app_total
    
app_all = list(set(app_all))

Créez une matrice avec le candidat (entreprise) dans la colonne et l'année de candidature dans la ligne. Commencez par créer une matrice vide (df) comme indiqué ci-dessous, puis

years = list(app_top10_dic.keys())
df = pd.DataFrame(index=app_all,columns=years).fillna(0)

Ajoutez le nombre d'applications à cela comme suit.

for i in app_total_dic:
    dic = app_total_dic[i]
    for d in dic:
        if(d[0] in app_all):
            df[i][d[0]] += d[1]

Enfin, vous obtenez une matrice comme celle-ci:

2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019
Sumitomo Metal Mine Co., Ltd. 6 14 7 13 2 7 15 18 16 25 35 54 56 60 61
Furukawa Battery Co., Ltd. 46 40 34 41 33 31 23 9 12 13 11 7 11 11 13
Dainippon Printing Co., Ltd. 4 14 12 0 5 9 29 59 5 9 2 1 5 0 0
Sanyo Electric Co., Ltd. 181 137 155 120 96 102 120 110 104 180 73 65 26 59 45
Samsung SDI Co., Ltd. 83 138 24 32 38 52 108 57 41 49 69 40 16 14 22
: : : : : : : : : : : : : : :
Semiconductor Energy Research Institute Co., Ltd. 0 0 0 0 0 0 9 7 15 16 22 54 24 12 12
GS Yoursa Corporation 57 20 11 17 0 0 0 0 0 0 0 0 0 0 0
GS Yuasa Co., Ltd. 43 16 38 40 39 44 56 76 79 75 99 72 83 41 31
Hitachi Maxell Co., Ltd. 29 20 8 28 26 17 39 49 48 46 63 35 39 14 0
Japon Zeon Co., Ltd. 2 5 5 5 6 16 28 29 43 67 62 45 55 22 2

Ceci est obtenu sous forme de trame de données pandas, vous pouvez donc facilement créer une carte thermique à l'aide de seaborn.

fig = plt.figure(figsize=(6,10),dpi=150)
sns.heatmap(df,square=True,cmap='Reds')

res1.png

Je pense que cela suffit, mais je fais aussi un graphique à bulles. Je ne peux pas (devrais) faire ça d'un seul coup, alors je ferai de mon mieux. J'ai remarqué la couleur et mis une légende.

fig = plt.figure(figsize=(6,10),dpi=150)

for n,y in enumerate(years):
    for m,x in enumerate(app_all[::-1]):
        plt.scatter(y,x,s=int(df[y][x]))

size = [100,200,300]
for s in size:
    plt.scatter(-100,-100,s=s,facecolor='white',edgecolor='black',label=str(s))
plt.legend(title='Patents', bbox_to_anchor=(1.03, 1), 
           loc='upper left',labelspacing=1,borderpad=1)

plt.xlim(-1,15)
plt.ylim(-1,30)
plt.xticks(rotation=45)
plt.show()

res2.png

C'est fait. C'est certainement plus facile à comprendre que la carte thermique.

Un rapide coup d'œil à l'ensemble révèle que Toyota est forte depuis 2013. Il est surprenant que Toshiba émette constamment des brevets depuis 2017, alors qu'il y avait diverses choses. C'est incroyable. Les brevets de Panasonic diminuent, mais compte tenu des applications de Panasonic IP Management et de Sanyo Electric (filiale), n'est-ce pas? Il y a trop de sociétés affiliées à Hitachi, et quelle est la différence entre GS Yuasa et GS Yuasa Corporation, il semble donc que les sociétés du groupe doivent être intégrées.

Résumé

C'est pourquoi j'ai essayé une petite touche sur l'analyse des brevets en utilisant Python. J'ai été influencé par les spécifications de J-PlatPat et j'ai oublié comment utiliser Pandas, mais pour le moment, j'ai fait un graphique à bulles, donc j'ai atteint mon objectif.

Cependant, il est possible que certains brevets aient été manqués en raison d'une spécification insuffisante des éléments de recherche. Cette partie semble nécessiter divers essais et erreurs.

Si vous pouvez obtenir le texte du brevet, il semble que vous puissiez faire diverses choses intéressantes avec l'analyse du langage naturel. En envisageant de faire référence au texte, [Google Patent Public Datasets](https://cloud.google.com/blog/products/gcp/google-patents-public-datasets-connecting-public-paid-and-private-patent Vaut-il mieux utiliser -data)?

J'étais satisfait pour le moment, alors j'ai fini ici!

Remarques

Les «Restrictions sur l'accès de masse, l'accès au robot, etc.» dans le guide d'utilisation de J-PlatPat indiquent comme suit.

J-PlatPat est utilisé publiquement pour les informations sur les droits de propriété industrielle. Par conséquent, les actions telles que le téléchargement de grandes quantités de données à des fins de simple collecte de données et d'accès au robot (collecte automatique régulière de données par un programme) qui peuvent interférer avec l'utilisation générale sont interdites. Je vais.

C'est pourquoi la collecte automatique programmatique est NG. Ne fais pas ça. Soyons prudents.

Je pense que l'on peut se demander si cette collecte de données mérite «de télécharger une grande quantité de données dans le but de la simple collecte de données», mais je pense que c'est probablement bien parce que je n'ai en fait téléchargé que 15 fichiers. Je vais.

Recommended Posts

[Analyse des brevets] J'ai essayé de créer une carte des brevets avec Python sans dépenser d'argent
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
Je veux faire un jeu avec Python
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
J'ai essayé de faire une simulation de séparation de source sonore en temps réel avec l'apprentissage automatique Python
Rubyist a essayé de créer une API simple avec Python + bouteille + MySQL
[1 hour challenge] J'ai essayé de créer un site de bonne aventure qui soit trop adapté à Python
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
[Python] J'ai essayé d'implémenter un tri stable, alors notez
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de créer une expression régulière de "date" en utilisant Python
J'ai essayé un langage fonctionnel avec Python
J'ai essayé de créer un générateur qui génère une classe conteneur C # à partir de CSV avec Python
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
J'ai fait une carte hexadécimale avec Python
J'ai créé une API Web
J'ai essayé de faire une étrange citation pour Jojo avec LSTM
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
J'ai essayé de créer un mécanisme de contrôle exclusif avec Go
J'ai essayé de communiquer avec un serveur distant par communication Socket avec Python.
J'ai essayé de créer un programme qui convertit les nombres hexadécimaux en nombres décimaux avec python
J'ai essayé de créer un LINE BOT "Sakurai-san" avec API Gateway + Lambda
[AWS] [GCP] J'ai essayé de rendre les services cloud faciles à utiliser avec Python
J'ai essayé l'analyse de données IRMf avec python (Introduction au décodage des informations cérébrales)
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python
J'ai essayé de créer un environnement de développement Mac Python avec pythonz + direnv
[Zaif] J'ai essayé de faciliter le commerce de devises virtuelles avec Python
J'ai essayé de créer un service de raccourcissement d'url sans serveur avec AWS CDK
J'ai essayé d'obtenir des données CloudWatch avec Python
Essayez de créer un code de "décryptage" en Python
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé d'automatiser la fabrication des sushis avec python
Essayez de créer un groupe de dièdre avec Python
Je veux écrire dans un fichier avec Python
J'ai créé un jeu ○ ✕ avec TensorFlow
[Python] Deep Learning: J'ai essayé d'implémenter Deep Learning (DBN, SDA) sans utiliser de bibliothèque.
Quand j'ai essayé de créer un VPC avec AWS CDK mais que je n'ai pas pu le faire
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
J'ai créé une API de recherche de château avec Elasticsearch + Sudachi + Go + echo
Un débutant en apprentissage automatique a essayé de créer un modèle de prédiction de courses de chevaux avec python
J'ai essayé de créer facilement un système de présence entièrement automatique avec Selenium + Python
[Python] J'ai essayé de créer une IA Shiritori qui améliore le vocabulaire grâce aux batailles
J'ai essayé de faire MAP rapidement une personne suspecte en utilisant les données d'adresse Geolonia
J'ai essayé de créer une API de reconnaissance d'image simple avec Fast API et Tensorflow