[PYTHON] Créez une carte des brevets avec Streamlit

introduction

Explication ↓

(Version 1) Machine-learned vector embedding based on document contents and metadata, where two documents that have similar technical content have a high dot product score of their embedding vectors.

__ Terminé __

Remarque: Si vous le déplacez tout le temps, cela coûtera GCP, donc il s'arrêtera sans préavis. Il ne fait pas non plus d'équilibrage de charge, donc la sortie peut prendre un certain temps. </ font>

image.png'

1 Créez des fichiers ipynb, etc. avec les notebooks de AI Platform

Tout d'abord, créez un côté application Python avec AI Notebook sur GCP. Un fichier .ipynb et deux fichiers .py comme indiqué ci-dessous.

image.png

2 Ouverture du port, etc.

Pour le rendre disponible sur le Web Après avoir suivi le didacticiel Streamlit, accédez à Exécuter Streamlit à distance En vous y référant, ouvrez le port de l'adresse IP externe du GCE sur lequel AI Notebook est exécuté.

Réseau VPC ⇒ Pare-feu, Spécifiez port = 8501 dans TCP (spécifiez streamlit). Désignation SourdeIPRange 0.0.0.0/0 (acceptée et fournie par tous)

  • Pour des raisons de sécurité, il est préférable de restreindre les adresses à libérer. À l'étude

2 Contenu de streamlit

Il y a 3 fichiers.

  • Le premier est simplement d'installer et d'exécuter streamlit
!streamlit run claimgen.py
  • Deuxièmement: quelque chose comme l'avant
plot.py
import streamlit as st
import pandas as pd
import plotly.graph_objects as go

#Troisième fichier py créé
import um

def drawfig(dataframe,cc):
    x = dataframe['xpos'].values
    y = dataframe['ypos'].values

   
    fig = go.Figure(go.Histogram2dContour(
        x = x,
        y = y,
        #xbins={'end':200, 'size':1, 'start': 0},
        zmin = 0,
        #zmax = 500,
        #ncontours=50,
        colorscale = 'Jet',
        contours = dict(
            showlabels = True,
            labelfont = dict(
                family = 'Raleway',
                color = 'white'
            )
        ),
        hoverlabel = dict(
            bgcolor = 'white',
            bordercolor = 'black',
            font = dict(
                family = 'Raleway',
                color = 'black'
            )
        ),
        

    ))
 
    
    fig.add_scattergl(x=dataframe["xpos"],
                y=dataframe["ypos"],
                mode="markers",
                marker=dict(size=3.5, color="blue"),
                text= "<a href='" + dataframe["url"]+ "' style='color: rgb(255,255,255)'>" + dataframe["index"] + "<br>" +dataframe["applicant"].str[0:15]+"…<br>"+dataframe["title"].str[0:15]+"…</a>",
                name="L'ensemble"
                )
    
    #x_disp_range =[-8,10]
    #y_disp_range =[-7,7]

     

    #fig.update_xaxes(range=x_disp_range)
    #fig.update_yaxes(range=y_disp_range)

    fig.update_layout(
        #title=dataframe['appday'].iloc[0],
        height = 800,
        width = 800,
        bargap = 0,
        hovermode = 'closest',
        showlegend = False
    )



    fig.write_html(cc+"_heatmap.html")
    #f2 = go.FigureWidget(fig)
    #fig.show()
    return fig




st.title('Carte 2D du document de brevet')
st.markdown('IPC et mots clés sur ce site@La population indiquée dans le titre a été calculée[embedding](https://console.cloud.google.com/marketplace/product/google_patents_public_datasets/google-patents-research-data?filter=solution-type:dataset)IlestaffichésousformedecarteàdeuxdimensionsavecUMAPdbasésur.Lesdonnéesd'intégrationdesdonnéesdebrevetutiliséespourlegraphiquesont[cette](https://console.cloud.google.com/marketplace/product/google_patents_public_datasets/google-patents-research-data)')


if st.button('Spécifiez les conditions de recherche'):
    text = st.text_input('Rechercher une entrée de mot', 'appareil')
    ipc = st.selectbox(
         'sélection ipc',
         (
     'G06F','A61K','H01L','G01N','H04L','A61B','H04N','C07D','H04W','C12N','G02B','B01D','B65D','H01M','G06Q','B29C','G01R','H04B','A61M','C07C','A61F','H01R','C08L','B01J','B41J','B65G','G11B','H05K','G06K','C02F','G02F','E21B','B23K','H02J','B32B','H02K','B60R','A23L','G03G','C07K','H04M','H05B','C04B','G01B','C08G','A01G','F16H','A01N','C08F','G06T','H01H','F24F','B62D','A01K','C12Q','F16L','A63F','C23C','F16K','B65H','G05B','A47J','E04B','G09G','H01J','B21D','C09D','G11C','F21S','C09K','B65B','A61L','C01B','H02M','G01M','C22C','H04R','G01S','G03B','A63B','C08J','H01F','B23Q','E02D','B60K','H01Q','G01C','B24B','H01B','F16D','E06B','G03F','F04D','A47L','A47B','F21V','F02M','A61N','H02G','F16C','F04B','G09B','G08B','B08B','G09F','F02D','E04H','A47G','B22D','D06F','F16B','B01F','E05B','H03K','A47C','B66B','F25B','E04F','B25J','F25D','G01F','B23B','B05B','B02C','F01N','B25B','E04G','C12P','B23P','H02P','G05D','B60N','H04J','C09J','B60T','B60C','A61H','G10L','G01L','B66C','G01D','F01D','G01V','H01S','G08G','C11D','A61G','A61C','F16F','H03M','C08K','F02B','A01D','H02B','B63B','H02H','F26B','A47K','C12M','B41F','B60W','C07F','B05D','B60L','A41D','C03C','F24C','H01G','F15B','C03B','G01J','F03D','A01H','C10G','F24H','B64C','E02F','B21B','C21D','G07F','B26D','A01C','F04C','B22F','E02B','E21D','A43B','A45D','C22B','C07H','E01C','H04Q','B60J','C25D','B28B','A61J','B41M','B05C','A23K','F16J'
         ))
    cc = st.selectbox(
         'Sélection de pays',
         ('JP', 'MX', 'US','AU','EP','CN'))



df = um.get_xypos_df(ipc,text,cc)
plotly_fig = drawfig(df.reset_index(),cc)

st.write(plotly_fig) 
st.write(get_apprank(df))
st.write("Les données")
st.write(df)





  • Le troisième est lié à bigquery et umap Est-ce que injection SQL est ok (martèlement)?
um.py
import umap
import pandas as pd
from google.cloud import bigquery


#partie bigquery
def get_df(s_ipc,s_text,cc):
    client = bigquery.Client()
    sql = """
        WITH gpat AS (
            SELECT 
            publication_number as pubnum,
            top_terms,
            url,
            embedding_v1 as emb
            FROM patents-public-data.google_patents_research.publications
        ),

        pat AS (
           SELECT publication_number as pubnum,
           filing_date as appday,
           STRING_AGG(DISTINCT title.text) as title,
           #STRING_AGG(DISTINCT abstract.text) as abst,
           STRING_AGG(DISTINCT appls.name,'|') as applicants
           FROM `patents-public-data.patents.publications`,UNNEST(title_localized) as title,UNNEST(assignee_harmonized) as appls,UNNEST(ipc) as ipcs
           WHERE SUBSTR(publication_number,0,2) = @cc 
           AND title.text LIKE @s_text
           AND ipcs.code LIKE @s_ipc          
           #AND filing_date > 20000101
           GROUP BY pubnum,filing_date
        )

       SELECT gpat.pubnum,
              gpat.url,
              gpat.top_terms,
              pat.title,
              #pat.abst,
              pat.applicants,
              pat.appday,
              gpat.emb
       FROM gpat
       INNER JOIN pat
       ON gpat.pubnum = pat.pubnum
       LIMIT 1000
    """
~~Omis parce que c'est long

3 Un peu d'analyse

Création à l'aide de This subject: Sonos v.s. google.

4. Difficultés

  • La partie qui reçoit le résultat de l'exécution de bigquery dans les pandas. Sur le net, normalement
# Download query results.
query_string = """
~~
"""

dataframe = (
    bqclient.query(query_string)
    .result()
    .to_dataframe(bqstorage_client=bqstorageclient)
)

Cela dit que cela peut être fait avec to_dataframe (), mais une erreur se produit et cela ne guérit pas. Cela ne peut pas être aidé, alors j'ai retiré les lignes de tuples qui sont revenues avec des tuples. Je l'ai mis dans les pandas. Je veux trouver un autre bon moyen.

  • Streamlit ne peut être ajouté que verticalement. Il semblait que l'écran pouvait être divisé, mais cela ne pouvait pas être réalisé avec l'API standard. Je dois étudier un peu plus ici. ⇒ Si vous voulez juste mettre la barre latérale, vous devez définir l'élément que vous souhaitez mettre dans la barre latérale comme st.sidebae. ~!

Recommended Posts