技術資料

目次 

目的 

近年,経営環境は大きく変化しており,いわゆるVUCA な時代を迎えている.企業が持続的な発展を図るためには,自社の核となる独自の強みを生かし,他者との差別化を図ることが極めて重要である.そんな中,IP ランドスケープが注目を集めている.本研究では,今日に至るまでの莫大な特許文章群を対象とした知見発見および探索を目的とする.


使用するファイル全部 

扱うデータ用途ファイル名ファイルの場所
システムの内部処理flaskを用いたシステムの記述appli_2.pyapplication
ドライバーのファイル自分の環境に合わせたChromeDriverの保存chromedriver.exeapplication
staticファイルjavascriptや画像のファイルが入っているstaticapplication
↑の中身3Dグラフを作成するときのjavascriptのファイルmain2.jsstatic
↑の中身javascriptで読み込む用のjsonファイルoutput.jsonstatic
↑の中身グラフのボタンを作成する用の画像xy2.png/xyz2.pngstatic
テキストデータ集めてきたテキストデータの一時保存text_data.pickleapplication
ベクトル(数値)2次元に圧縮したベクトルvectors.pickleapplication
ベクトル(数値)15次元に圧縮したベクトルvectors_15.pickleapplication
シルエット係数それぞれのクラス数におけるシルエット係数の値shilhouette.pickleapplication
クラスタリング結果クラスタリングの結果のデータdf_umap.pklapplication
simpson係数simpson係数の値と単語の出現回数などjaccard_coef.pklapplication
ユーザー辞書各クラスターのユーザー辞書の保存user_dic_{classXX}.csv[XX=クラスターの番号(例.class03)]application
共起語ネットワーク2dの共起語ネットワークのhtmlファイルkyoki_100.htmlapplication


スクレピング処理 

ChromeDriverのインストール 

まず、ChromeDriverをインストールする.自身のGoogleChromeのバージョンを確認し,それに合ったバージョンをインストールする(https://chromedriver.chromium.org/downloads).

わからなかったらここを見て👇
👉https://zenn.dev/ryo427/articles/7ff77a86a2d86a


1.データ取得 

seleniumのインストール 

seleniumをインストールする.バージョン3でもよいが,プログラムの書き方が異なる.

<pythonのとき>
pip install selenium
<notebookのとき>
!python -m pip install selenium

必要なモジュールをインポートする. 

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service

driverのオプションを設定する. 

options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

chromedriverのパスを設定する. 

インストールしたchromedriver.exeの場所を指定する.

driver_path = "chromedriver-win64/chromedriver.exe"

driverを作成する. 

driver1 = webdriver.Chrome(service=ChromeService(driver_path), options=options)
driver1.implicitly_wait(10)

⚠seleniumのバージョンによってコードの書き方が異なる場合がある(今回はver=4.12.0 )

urlの指定方法 

urlでユーザーからのキーワードと取得する年数を指定する.

url_1 = (
    "https://patents.google.com/?q=("
    + str(keyword)
    + ")&before=priority:"
    + str(2000)
    + "1231&after=priority:"
    + str(2000)
    + "0101&sort=old"
)

取得方法 

def W1(url):
       driver1.get(url)
       try:
           results1 = driver1.find_element(
               By.XPATH, '//*[@id="count"]/div[1]/span[1]/span[3]'
           ).text.replace(",", "")
           if int(results1) <= 10:
               p_n_1 = 1
           else:
               p_n_1 = int(results1) // 10
       except Exception as e:
           print("error")
       for p1 in range(p_n_1 + 1):
           driver1.get(url + "&page=" + str(p1))
           link1 = driver1.find_elements(
               By.XPATH,
               '//*[@id="resultsContainer"]/section/search-result-item/article/state-modifier',
           )
           for i1 in range(len(link1)):
               try:
                   link_url1 = "https://patents.google.com/" + link1[i1].get_attribute(
                       "data-result"
                   )
                   patt1 = pat_text(link_url1)
                   patt1.get_soup()
                   # patt.get_title()
                   patt1.get_claims()
                   
                   d_save1 = []
                   d_save1.append(patt1.get_description())
                   d_save1.append(link1[i1].get_attribute("data-result"))
                   desc1.append(d_save1)
               except Exception as e:
                   print(e)

1.urlから中身を取得する.
2.find_elementで検索結果の数を取得する.
3.p_n_1にページ数を渡す.

4.各ページの中から特許番号を取得する.

5.find_elementで特許番号(例:patent/JP5965646B2/ja)の部分を取得する
6.取得した番号をもとにhtmlのurlを作成し,関数(pat_text)に渡す.
7.pat_textからの本文と特許番号をd_save1に渡す.
👇実際の取得結果

テキストフォーマット2.jpg



並列化 

threadsを用いて並列化を行う.

import threading
   thr1 = threading.Thread(target=W1, args=(url_1,))
   thr2 = threading.Thread(target=W2, args=(url_2,))
   thr3 = threading.Thread(target=W3, args=(url_3,))
   thr4 = threading.Thread(target=W4, args=(url_4,))
   thr5 = threading.Thread(target=W5, args=(url_5,))
   thr6 = threading.Thread(target=W6, args=(url_6,))
   ~~~~~省略~~~~~
           thr24まで
   ~~~~~~~~~~~~

threadを一年ごとに設定する.
それを6年ずつ実行する
要素が混在しないように一年ごととそれぞれのスレッドごとにdescを用意する.

   desc01 = []
   desc02 = []
   desc03 = []
   desc04 = []
   if int(year) == 24:
       desc1 = [] desc2 = [] desc3 = [] desc4 = [] desc5 = [] desc6 = []
       thr1.start() thr2.start() thr3.start() thr4.start() thr5.start() thr6.start()
       thr1.join() thr2.join() thr3.join() thr4.join() thr5.join() thr6.join()
       desc01 = desc1 + desc2 + desc3 + desc4 + desc5 + desc6
   if int(year) == 18 or int(year) == 24:
       ~~~~~省略~~~~~
           thr7からthr12まで
       ~~~~~~~~~~~~
       desc02 = desc1 + desc2 + desc3 + desc4 + desc5 + desc6
   if int(year) == 12 or int(year) == 18 or int(year) == 24:
       ~~~~~省略~~~~~
           thr13からthr18まで
       ~~~~~~~~~~~~
       desc03 = desc1 + desc2 + desc3 + desc4 + desc5 + desc6
   ~~~~~省略~~~~~
      thr19からthr24まで
   ~~~~~~~~~~~~
   desc04 = desc1 + desc2 + desc3 + desc4 + desc5 + desc6

最後に各スレッドのdescを合わせる

   desc = desc01 + desc02 + desc03 + desc04


1.3 生体センサによるストレス予測:その2(stress_data,state) 

数の微調整のため、ラズパイにarduinoIDEをインストールしておくと楽
王道:心拍からストレス値を出す
1.心電図からRRI間隔を出す
2.パワースペクトル密度を算出
  周波数解析によって求めることができる。データ数は1024はいるから心拍を配列にためてたまってから求める
3.高周波(HF)と低周波(LF)の面積を求める。LF/HFでストレス数値
4.個人差はあるが2以上が注意、5以上が表注意と言われている

処理はラズパイのnewsensa_all.pyのメインのところ、cnt<=5になっていると思うが、このcntを心拍配列にしておく
生体環境センサにくっつけて送信。

行動時間はtotal_secondsで経過時間を秒に直し、規定値(45分)と比べる
processing_data.pyのstate決定するとこ,ついでにここでコーピングしない場合の図と指令も定義する(コーピング発動しない場合)

#発動しない場合
   if total_second_time < 2700 and stress_data <6.0:
       if stress_data <=2.0:
           state = '良好'
           figure='1.png'
           cope = 'No'

       else :
           state = '注意'
           figure='2.jpg'
           cope = '警告 : 危機が迫っている'

   #発動する場合
   else:#コーピング内容をだらだらかく


#ref(): File not found: "newsensaall.py" at page "平井さん卒論_backup"

1.4 3つの要素からコーピング内容決定 (cope,figure) 

ストレスが検知されたらコーピングを発動させる
まず行動経過時間から長時間か短時間化を判別。
今回は60分(1,2時間)同じ行動だと判断されたら場所に応じた内容、短かったら行動自体に問題があるので行動切り替えを促す
(本人が気づかぬうちに長時間行動で身体的負担が増すことを防止する)
また想定される場所に応じて、(ストレス感じる内容を把握)適度なコーピングを示したい。
いろいろ調べてもコーピング内容はほぼ一緒だったので、その行動が可能かを踏まえた。

#ref(): File not found: "1131.JPG" at page "平井さん卒論_backup"


  #スプレッドシートの単語から
       #if ('computer' and 'monitor') in camera11:
       #とりあえずPC操作にしておいた
       #    cope2 = 'コンピューター操作により'
        #   cope3 = '休憩に入り、目を休め'
    
       #行動識別から
       if 'パソコン' in situation:
           cope2 = 'コンピューター操作により'
           cope3 = '休憩に入り、目を休め'
       elif '会議'in situation:
           cope2 = '会議中なので'
           cope3 = 'ちょっと休め、耐えろ'
       elif '休'in situation:
           cope2 = '休憩でも'
           cope3 = '止めなさい'
       elif '天井'in location:
           cope2 = 'お前'
           cope3 = '休みすぎ'
       elif 'kichen'in location:
           cope2 = '打ち合わせより'
           cope3 = '止めた方がいいんじゃない'
       else:
           cope2 = 'その他の行動により'
           cope3 = '気分展開しよう'
    
   #とりあえす経過時間が長かった(90分以上,30分以上,それ以下)ら
       if int(total_time.total_seconds()) > 2400:
           print("長すぎ")
           cope1 = '長時間行動より'
       elif int(total_time.total_seconds()) > 1800:
           print("長時間行動")
           cope1 = '長時間行動と'
       else:
           print("短時間労働")
           cope1 = '行動は短いが'
           #cope3 = '行動を止めたほうがいい'
       state = '要注意、コーピングを実行'
       figure = '5.jpg'
       cope= cope1+cope2+cope3

ウェブ表示法アシスト:GooGle経由の場合 

追記:pyにhtml直書きにしてテキストファイル経由しないようにした データをドライブに保存し,自身のPCでcsvファイルにログを備蓄したあと,データをもとにhtmlを作成する.
流れはcsvファイルを編集するコード(py),表示されるウェブページ(html),MOVERRIO(グラス)の順で表示する

#ref(): File not found: "87.JPG" at page "平井さん卒論_backup"

1.収集したデータをもとに表示する文字を作成(選択)
2.processing_data.py内で編集、htmlファイルの文字を書き直す形で編集する
3.htmlファイルができる
4.PC(Windowsの場合)htmlがある📁のパスを通す.
  Internet Information service (IIS)のDefault WebSiteの「機能ビュー」の「詳細設定」で📁物理パスを設定.
  さらに「既定のドキュメント」に追加.
5.こうするとPCと同一Wi-Fi内でのみ「http://(PCの物理アドレス)」でグラスにhtmlが表示される.

・py内のhtmlファイル編集

   #コーピング発動html
   opendata = r"C:/Users/wasaza/Desktop/nana/nan.html"
   
   with open(opendata, mode='w+', encoding="utf_8") as f:
       data_line4=('<!DOCTYPE html>\n<head>\n<meta http-equiv="content-type" charset="utf-8">\n</head>\n<body>\n<div style="font-size:small">\n')
       data_line5=('<br>\n</div>\n</body>\n<img src=' + figure + ' width="60"></html>')
       data_lines=('場所 :' + location + '<br>\n状況 :' + situation + '<br><br>\n\n経過時間 :' + str(total_time) + '<br>\n')
       data_lines2 = ('ストレス予測値 :' + str(stress_data) + ' / 状態 :'+ state+'<br>\n指令 :'+cope)
       data_lines3=('Today :' + str(now_time) + '<br>\n')
       f.write(data_line4)
       f.write(data_lines3)
       f.write(data_lines)
       f.write(data_lines2)
       f.write(data_line5)


ラズパイ,グラス,実行PC(を同一Wi-Fiに接続し,表示する。


・IISの設定

#ref(): File not found: "11102.JPG" at page "平井さん卒論_backup"

・実際表示されたhtml

#ref(): File not found: "13.JPG" at page "平井さん卒論_backup"

winscpのミラーリング機能を使ったら時間限定で
パソコンで変更しても研究室のサーバーから発信できたので
学外のスマートグラスでも見れるようになった


研究室サーバー:Google経由しない場合 


#ref(): File not found: "arg2.JPG" at page "平井さん卒論_backup"

データの流れ 

0.サーバー側のserver.pyと、ラズパイ側のsendata.pyをソケット通信
1.newsensa_all.pyでマイク以外のセンサデータを30秒毎取得しjsonファイルを作成、gasmic.pyで音声データを任意のタイミングで取得しjsonファイルを作成
2.sendata.pyでjsonファイルが生成されたらサーバーに送信。その後送ったファイルは消す。
3.送られてきたデータサイズでセンサデータかマイクデータか識別、各々のxlsxファイルに保存
4.processing_data.pyでxlsxファイルにアクセス、新規データ含めライフログ作成、クラスター分析しhtml作成
5.コーピングしたか(1,0)とかLH/HFとかをストレスログ(foo.csv)に保存
6.同フォルダにあるhttps通信設定したhtmlファイルが更新される。

#ref(): File not found: "232.JPG" at page "平井さん卒論_backup"


MOVERIOにhtmlを映す方法 

1.htmlをhttps通信で公開
2.何らかのスマホ(デザリングしたスマホ?)で開く
3.そのスマホにAuto Refreshアプリをダウンローそしてchromeを30秒で更新
4.そのスマホとMOVERIOをミラキャスト。スマホはAndroidがいい?iPhoneは分からん
5.つまりMOVERIOにスマホ画面を表示させる。


実装の流れ 

1.サーバーを動かす 

pcを操作し、ラズパイからデータを受信できるよう設定する

・手順
1.pcでコマンドプロンプトを開く。
2.ssh iie.lab.tpu@133.55.115.240と入力する。(転送プロトコル→SFTP、ホスト名→133.55.115.240、ポート番号→22、ユーザー名→raspi、パスワード→(秘匿))
3.パスワードを要求されるので入力する。(パスワードは8*NJ9!$a%cKm)
4.sudo su -と入力すると、ルート権限を入手できる。また、その時に再度パスワードを入力する。
5.cd ..と入力する。
6.cd var/www/html/iie.lab.tpu.comと入力し、/var/www/htmlのフォルダに移動する。
7.python processing_data_server2.pyと入力する。(これにより、ラズパイとサーバーのデータの送受信ができるようになる。)

・コマンドプロンプトが以下の通りとなっていればよい。

#ref(): File not found: "1.png" at page "平井さん卒論_backup"


2.ラズパイでデータを取得する 

・手順
1.ラズパイ上のコマンドプロンプトでpython sendata.pyと入力する。(これにより、サーバー上にデータを送信できるようになる)
2.別のコマンドプロンプトを起動し、python newsensa_all_esk_3.pyと入力する。
3.newsensa_all_esk_3.pyが作動している間はウェアラブル装置を装着しながら待つ。
4.newsensa_all_esk_3.pyの表示が500に達したら、別のコマンドプロンプトを起動し、pyhon gassmic_esk_2.pyと入力する。
5.gassmic_esk_2.pyを実行したら、マイクにok googleと言う。
6.start recignized by ok googleと表示されたら待機。

3.ソケット通信を行う 

・ラズパイ上のsendata.pyの実行画面において、1024に達したときにpython processing_data_server2.pyの実行画面が以下の通りになっていればラズパイのデータがpcに送信されたことになる。

#ref(): File not found: "2.png" at page "平井さん卒論_backup"


・手順
1.ラズパイ上のsendata.pyの実行画面において、1024に達したときpcの別のコマンドプロンプトを起動し、再度/var/www/htmlのフォルダに移動する。
2.processing_data_server.pyと入力する。
3.pcでhttps://dic515s2.pu-toyama.ac.jp/iie.lab.tpu.com/Image2.html   にアクセスし、実行結果を確認する。

実行結果一覧
・ストレス数値が0以上2未満のとき↓

#ref(): File not found: "3.png" at page "平井さん卒論_backup"

・ストレス数値が2以上5の未満とき↓

#ref(): File not found: "4.png" at page "平井さん卒論_backup"

・ストレス数値が5以上のとき↓

#ref(): File not found: "5.png" at page "平井さん卒論_backup"


4.行動を行う 

行動を変えるたびにマイクで「場所 状況」を入力する。ホットワード含め入力できたかはボードのランプを見れば分かる。
入力後にランプが点滅したら成功。
グラスのHTMLが更新されなくなったらなんか不具合が起きたのでもう一度HDMI接続しなおしてみる。
◎考えられる不具合

実行と無視を行う場合、最後の実行指令に従いコーピングを行う


5.(実験後)検証 

検証の準備 

・windowsの場合
サーバーにセンサデータ(fordend.xlsx,fordend2.xlsx)とライフログ(fordend.csv)とストレスログ(foo.csv)が記録されている
それらを見るためにwinSCPというサーバーを遠隔操作するソフトをインストールしておく

アカウントや権限に関しては管理者に一任します

検証1 LF/HFの変化の検定 

実験後、foo.csvには実験中のHTMlの情報が記録されている。
つまり1分ごとのLF/HFなどが記録されている。
Excelで開いてグラフ作ってLF/HFの変移が分かる
ちなみにcsvファイルをExcelで開いてグラフを作っても保存されないから適当にxslxファイルに丸写しして作成したほうがいい
もしくはグラフ作ったらキャプチャして残す。二度と見れなくなるけど
こんな表を用意する

無視前無視後差(後―前)実行前実行後差(後ー前)

◎検定方法
コーピング発動したか(1か0、copenとする)とコーピングしたか(1か0、copegとする)を見て無視したときと実行したときのLF/HFの変化を見る

まずcopenが0から1になった時、

次にcopenが1のままcopegが0から1もしくは1から0になった時

さらにcopenが1のままcopegが0から0、もしくは1から1になった時

記録が終わったら差分を計算して両方の差を求める。

つづいてF検定を行う。変数は無視の差(後ー前)と実行の差(後ー前)の2つ(習ったやろから省略)
F検定で等分散性があるかないかでちがうT検定を行う
検定のタイトルが(等分散性があると仮定したT検定とかだったから見りゃわかる)
T検定のP値が0.05以下なら2つの変数には有意な差があると断定できる
つまりコーピング実行と無視したときではLF/HFの変化の仕方が違うと言える

検証2 全センサデータの決定木分析 

まずkoo.csvを用意する
ワイのドライブに使用したkoo.csvがあるからデータを消して(1列目のラベルだけ残す)おく
実はprocessing_data_sever.pyの最後にstress_decision_tree.pyを実行するようになってんだけどサーバーにtreeをインストールするのがだるいから自分のパソコンに入れた
というわけでまず自分のPCにtreeモジュールとgraphvizをネットで調べてインストールしろ(ワイのドライブに一応ある)
インストールできたらさっき自分のPCに入れたfordend.csvとkoo.csvと同じフォルダにワイのドライブにあるpython.pyをダウンロードして実行する
そのフォルダ内に決定木結果(tree.png)が作成される。
stress_decision_tree.pyのフォルダ名とかをちゃんと変更しておくこと

ちなみになぜかサーバーで実行するとデンドログラムが表示されない、LF/HFのグラフは作成されるのに
本研究ではデンドログラムはぶっちゃけいらんのやけど行動識別できているか確かめるために作成しなきゃいけない
ワイが作ったゼミ用のページに「processing_data_2.py」がある。
これはスプレッドシートにアクセスせずに同じフォルダにあるfordend.csvからデンドログラムとコーピング処理を行うプログラムになっている。
これを実行するとデンドログラムがど作成され、den.pngが保存される

#ref(): File not found: "226.JPG" at page "平井さん卒論_backup"

使ったコード全部 

江崎のドライブに全部ある、はず
江崎のドライブに全部ある、はず名前が若干違うかも


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS