近年,経営環境は大きく変化しており,いわゆるVUCA な時代を迎えている.企業が持続的な発展を図るためには,自社の核となる独自の強みを生かし,他者との差別化を図ることが極めて重要である.そんな中,IP ランドスケープが注目を集めている.本研究では,今日に至るまでの莫大な特許文章群を対象とした知見発見および探索を目的とする.
| 扱うデータ | 用途 | ファイル名 | ファイルの場所 |
| システムの内部処理 | flaskを用いたシステムの記述 | appli_2.py | application |
| ドライバーのファイル | 自分の環境に合わせたChromeDriverの保存 | chromedriver.exe | application |
| staticファイル | javascriptや画像のファイルが入っている | static | application |
| ↑の中身 | 3Dグラフを作成するときのjavascriptのファイル | main2.js | static |
| ↑の中身 | javascriptで読み込む用のjsonファイル | output.json | static |
| ↑の中身 | グラフのボタンを作成する用の画像 | xy2.png/xyz2.png | static |
| テキストデータ | 集めてきたテキストデータの一時保存 | text_data.pickle | application |
| ベクトル(数値) | 2次元に圧縮したベクトル | vectors.pickle | application |
| ベクトル(数値) | 15次元に圧縮したベクトル | vectors_15.pickle | application |
| シルエット係数 | それぞれのクラス数におけるシルエット係数の値 | shilhouette.pickle | application |
| クラスタリング結果 | クラスタリングの結果のデータ | df_umap.pkl | application |
| simpson係数 | simpson係数の値と単語の出現回数など | jaccard_coef.pkl | application |
| ユーザー辞書 | 各クラスターのユーザー辞書の保存 | user_dic_{classXX}.csv[XX=クラスターの番号(例.class03)] | application |
| 共起語ネットワーク | 2dの共起語ネットワークのhtmlファイル | kyoki_100.html | application |
まず、ChromeDriverをインストールする.自身のGoogleChromeのバージョンを確認し,それに合ったバージョンをインストールする(https://chromedriver.chromium.org/downloads).
わからなかったらここを見て👇
👉https://zenn.dev/ryo427/articles/7ff77a86a2d86a
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
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
インストールしたchromedriver.exeの場所を指定する.
driver_path = "chromedriver-win64/chromedriver.exe"
driver1 = webdriver.Chrome(service=ChromeService(driver_path), options=options) driver1.implicitly_wait(10)
⚠seleniumのバージョンによってコードの書き方が異なる場合がある(今回はver=4.12.0 )
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に渡す.
👇実際の取得結果
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
数の微調整のため、ラズパイに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"
ストレスが検知されたらコーピングを発動させる
まず行動経過時間から長時間か短時間化を判別。
今回は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
追記: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のミラーリング機能を使ったら時間限定で
パソコンで変更しても研究室のサーバーから発信できたので
学外のスマートグラスでも見れるようになった
#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"
1.htmlをhttps通信で公開
2.何らかのスマホ(デザリングしたスマホ?)で開く
3.そのスマホにAuto Refreshアプリをダウンローそしてchromeを30秒で更新
4.そのスマホとMOVERIOをミラキャスト。スマホはAndroidがいい?iPhoneは分からん
5.つまりMOVERIOにスマホ画面を表示させる。
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"
・手順
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と表示されたら待機。
・ラズパイ上の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"
行動を変えるたびにマイクで「場所 状況」を入力する。ホットワード含め入力できたかはボードのランプを見れば分かる。
入力後にランプが点滅したら成功。
グラスのHTMLが更新されなくなったらなんか不具合が起きたのでもう一度HDMI接続しなおしてみる。
◎考えられる不具合
実行と無視を行う場合、最後の実行指令に従いコーピングを行う
・windowsの場合
サーバーにセンサデータ(fordend.xlsx,fordend2.xlsx)とライフログ(fordend.csv)とストレスログ(foo.csv)が記録されている
それらを見るためにwinSCPというサーバーを遠隔操作するソフトをインストールしておく
アカウントや権限に関しては管理者に一任します
実験後、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の変化の仕方が違うと言える
まず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"
江崎のドライブに全部ある、はず
江崎のドライブに全部ある、はず名前が若干違うかも