Jupyter notebook による検索から3Dグラフ構築(2022年度)
の編集
Top
/
Jupyter notebook による検索から3Dグラフ構築(2022年度)
[
トップ
] [
編集
|
差分
|
履歴
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
島部/menu/template
[[技術メモ]] このサイトは[[スクレイピング・自然言語処理・3Dグラフ]]をもとに作成しています。 #contents * 行うこと [#vbb3086e] -WEBサイトから文章を自動取得(スクレイピング) -自然言語処理(形態素解析)で取得した文章を単語に分解 -単語間の共起頻度を計算し、隣接行列を作成する -隣接行列から3Dグラフを生成する ** キーワード [#y158d4a1] -スクレイピング --Webサイトから何かしらのデータを自動で取ってくる技術のこと -テキストマイニング --文章中の単語どうしのつながりなどを分析し、有用な情報を見つける(マイニングする)こと - Jupyter notebook --ブラウザ上で開発する統合開発環境 --プログラム(主にPython)を対話的に実行できる *前準備 [#t210542d] **(1)添付フォルダのダウンロード [#p76f8c3c] #ref(Websc3D.zip,,添付フォルダ1) #ref(neologd.zip,,添付フォルダ2) フォルダ内のファイルについて -keywords.csv --スクレイピングする際に必要なキーワードを入れるcsvファイル -stopwprd.txt --文章から除外する指示語や代名詞を載せたリスト -4つのjavascript(js)ファイル --3Dグラフがhtml上で動作するのに必要なもの -Server.py --Jupyterで作成したグラフ情報をhtmlに送るためのもの -web3D.html --3Dグラフを描画する場所 -web_tmining3dg.jpynb --テキストマイニングを行うJupyterファイル -(neologd内)NEologd.20200820-u.dic --文章を単語に分解する際に参照する辞書 **(2)pythonからjupyterインストール [#p8f1dfa4] (anacondaを使ってる場合はanacondaから開く) -コマンドプロンプトでpythonのパスの通りを確認 python -V -jupyterをインストール pip install jupyter environment_kernels -jupyter起動 jupyter notebook **(3)プログラム編集ページの起動 [#q1ea3350] ***1.起動後のホーム画面からDLしたフォルダをたどって、web_tmining3dg.ipynbを開く [#hbf43353] #ref(3DGraph-pre.png,,40%)~ -開くと今回実行するプログラムが出てくる ~ #ref(3DGraph-pre2.png,,40%) -jupyterではプログラムを分割し、一行単位でプログラムの挙動を確認できる~ →システム開発をするときに便利 -今回はプログラムを1番~21番まで分割してあるので、順番に実行していく ***jupyterについて [#l7f5c18a] -Shift + Enterで実行できる -処理中は[*]となり、終わると左上に番号が出るのでそれまで待つ -プロンプトで動いているjupyterプログラムを停止or閉じると、リセットされ、1番目からやり直しする必要があるので注意 ~ ~ *プログラム実行手順 [#d2478c54] *プログラム実行手順 [#z218aebc] -基本はプログラムを一つずつ実行することになる[#ef1e755a] **実行前にやること、実行時のエラー対応+プログラムの補足説明を載せているので、その都度確認する [#a9c861ae] ~ ***2. 1番目のプログラム実行時 [#r53ffa6b] <!-- -importでno moduleエラーが出ると思うのでpip installしていく -jupyter画面左上の+でコードを書くセルを出せるので、そこに打ち込んでいく -入れるもの scipy requests_oauthlib ------------スクレイピング用 selenium chromedriver_binary bs4 lxml ------------自然言語処理用 emoji nltk MeCab ------------3Dグラフ用 networkx ------------Server.py起動用 flask flask_cors ->> 何かのモジュールがないと出るたびにpipで入れていく ~ ***3. 3つ目のプログラムを実行する前 [#v0c92b07] 配布フォルダ中のcsvを編集する #ref(3DGraph0.png,,40%) --属性データ(大学生・夫婦など)、検索キーワード、地名データ(東京・太閤山など)には検索したい好きなワードを入れる。(キーワードなしのときは「指定しない」を入れる) --4行目を編集したcsvがあるディレクトリにする~ 例 rd = pd.read_csv(C:/Users/iiela/Desktop/keywords.csv', encoding="shift-jis") ~ ***4. 4つ目のプログラム(スクレイピング)実行時 [#ibf3ac9e] --下のエラーが出る場合(pipのseleniumとchrome.exeのバージョンが違うエラー) selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 88 Current browser version is 92.0.4515.131 with binary path C:\Program Files (x86)\Google\Chrome\Application\chrome.exe 言われているバージョンをpip install(ver.88→ver.92へ) pip install chromedriver-binary==92.0.4515.131 おそらく赤字でエラーが出る ERROR: Could not find a version that satisfies the requirement chromedriver-binary==92.0.4515.131 (from versions: ~~~, 91.0.4472.101.0, 92.0.4515.43.0, 92.0.4515.107.0, 93.0.4577.15.0) ERROR: No matching distribution found for chromedriver-binary==92.0.4515.131 バージョンが列記されると思うので一番近いバージョンをインストール pip install chromedriver-binary==92.0.4515.107.0 ~ --逆パターンでchrome.exe(クローム本体)のver.が(例)92.0.4515.107.0でよりchromedriver-binaryの方が93で新しいということもある~ →その場合、chrome.exeのバージョンと同じchromedriver-binaryをインストールする pip install chromedriver-binary==92.0.4515.107.0 ------ ◎4行目について -csvに入れたキーワードで自動検索するソースコード~ -htmlで検索窓を実装しているタグ(qというnameタグ)を探し,そこにキーワードを打ち込んで検索ボタンを勝手に押すようにしている #ref(3DGraph1.png,,40%) ~ --#2のrankinng関数を呼び出し,検索結果のwebサイトのリンクとタイトルをスクレイピングする~ (→どちらもtF2Cxcというclassタグに入っているので,そこを見つけて取ってきている) ~ ------ #ref(3DGraph2.png,,40%) ~ ***5. 5つ目のプログラム [#r0f3d2c7] 保存したリンク先のWebサイトに飛び,文章をスクレイピングする~ →最終的に1つのテキストファイルに文章は保存される --linkdir,txtdirを添付フォルダ内のディレクトリにする ~ **この後もファイルの保存・呼び出しで、パスを指定する箇所がいくつかあるが [#q6dffff3] **1番下のファイル名は変えず、C:からWebsc3Dまでを自分のものに変更していく [#h08cacf2] ~ **(4)形態素解析、共起頻度計算 [#t7b5c738] 形態素解析:文章を意味のある最小単位の単語(形態素)に分解して分析する(自然言語処理の一種) ***6. 8つ目のプログラム実行前1~ [#hf17a28b] -Mecab(形態素分析を行うモジュール)をインストールする(リンク先の.exeのみ) https://github.com/ikegami-yukino/mecab/releases/tag/v0.996 -パスを通しておく(システム環境変数の編集で変数Pathを編集する)~ ~ #ref(3DGraph3-1.png,,60%)~ ~ 新規でmecab.exeがあるパスを追加する C:\Program Files\MeCab\bin\ ~ #ref(3DGraph3.png,,60%) -mecabと打った後、「形態素解析」と打ってみる~ 何か出てEOSが表示されていればOK -pythonでもmecabを試す --下図の4行を1行ずつ打ち込んで形態素解析結果が出ればOK import sys import MeCab m = MeCab.Tagger ("-Ochasen") print(m.parse ("東京特許許可局")) #ref(3DGraph3-2.png,,40%) ~ ***7. 8番目のプログラム実行前2→辞書の更新~ [#q0bc128b] #8でやっていること:文章から不必要な文字列を除去し,Mecabの辞書に基づいて単語単位に分割する ---- -辞書について --どのような単位で単語を区切るかなどのルールを記したもの --辞書はなるべく頻繁に更新したほうがいい~ デフォルトの辞書(2007年版?)では「進撃の巨人」に対して「進撃 の 巨人」という分析をしてしまう~ →辞書を日々更新することで流行語などを正確に1つの単語として分析してくれる インストールしたMecabには古い辞書しか入っていないので、NEologdという新しい辞書を追加する ---- --C:\Program Files\MeCab\dic 内に配布フォルダ内dicの中のneologdをコピーする #ref(3DGraph4.png,,40%) --Program Files/MeCab/etcの中にあるmecabrcをメモ帳で開き,下の一行を追加する ; userdic = /home/foo/bar/user.dic userdic = C:\Program Files\MeCab\dic\neologd\NEologd.20200820-u.dic ***8. mecabrcを上書き保存する際、アクセス許可がないという旨のエラーが出るとき [#u99aa8e9] 右クリックでmecabrcのプロパティを開き、Usersの「書き込み」にチェックを入れる #ref(3DGraph4-1.png,,60%) ***12番目のプログラムの補足~ [#r0608430] 隣接行列を生成(まだ要素は0のまま)~ -3Dグラフの基となる -行の単語から列の単語に向かって矢印が描かれ,値がエッジ(辺)の太さになる ***13番目の補足[#tecdfe58] 共起頻度を計算する -word_list(重複している単語リスト)を基に順序関係を見る #ref(3DGraph5.png,,40%) 例えば、単語'あ'の次に'う'が来ているので隣接行列の'あ'行'う'列の要素に+1される~ (文章中の単語'あ'から'う'が1回共起されたとみなす) ***15番目の補足 [#pde39fbb] --全ての行の共起頻度の合計を計算する --合計値の大きい順に単語を並び替える(列に対しても同じ操作をする) --上位数十件(DfNumで調整)の単語だけ切り取った隣接行列を作る ***16番目の補足 [#v604d322] --単語の重み(正規化した共起頻度)を出す ***17番目の補足 [#bb94ca83] --閾値以下の単語を除外して,新しい隣接行列を作る **(5)Jupyterで3Dグラフを開く [#we4ecc57] ***18番目の補足~ [#db7f2224] 今pandasのデータフレーム型になっている隣接行列をpythonの辞書型に変換する~ →この辞書を参考に3Dグラフが作られる --"nodes"にはノード(頂点)に入れる単語の情報が入る(csvのキーワードになっている単語だけ赤色になるなど) --"links"にはエッジ(辺)の情報(矢印の出発ノードから到着ノード,辺の太さweight(単語間の共起頻度など)が入る -19番目の補足~ 辞書型のデータをjson形式にする --サーバとデータをやり取りするときはjson形式にすることが多い -20,21番目の補足~ サーバ経由でデータを送って,htmlで3Dグラフを描画する ***Internet Explorerで開かれる場合、#21_2と#21_3を使ってデフォルトで開くブラウザを変更する [#m840cf24] BackgroundBrowser()の中にはchrome.exeが保存されているパスを指定する (windows画面左下でchrome.exeを検索する)
タイムスタンプを変更しない
[[技術メモ]] このサイトは[[スクレイピング・自然言語処理・3Dグラフ]]をもとに作成しています。 #contents * 行うこと [#vbb3086e] -WEBサイトから文章を自動取得(スクレイピング) -自然言語処理(形態素解析)で取得した文章を単語に分解 -単語間の共起頻度を計算し、隣接行列を作成する -隣接行列から3Dグラフを生成する ** キーワード [#y158d4a1] -スクレイピング --Webサイトから何かしらのデータを自動で取ってくる技術のこと -テキストマイニング --文章中の単語どうしのつながりなどを分析し、有用な情報を見つける(マイニングする)こと - Jupyter notebook --ブラウザ上で開発する統合開発環境 --プログラム(主にPython)を対話的に実行できる *前準備 [#t210542d] **(1)添付フォルダのダウンロード [#p76f8c3c] #ref(Websc3D.zip,,添付フォルダ1) #ref(neologd.zip,,添付フォルダ2) フォルダ内のファイルについて -keywords.csv --スクレイピングする際に必要なキーワードを入れるcsvファイル -stopwprd.txt --文章から除外する指示語や代名詞を載せたリスト -4つのjavascript(js)ファイル --3Dグラフがhtml上で動作するのに必要なもの -Server.py --Jupyterで作成したグラフ情報をhtmlに送るためのもの -web3D.html --3Dグラフを描画する場所 -web_tmining3dg.jpynb --テキストマイニングを行うJupyterファイル -(neologd内)NEologd.20200820-u.dic --文章を単語に分解する際に参照する辞書 **(2)pythonからjupyterインストール [#p8f1dfa4] (anacondaを使ってる場合はanacondaから開く) -コマンドプロンプトでpythonのパスの通りを確認 python -V -jupyterをインストール pip install jupyter environment_kernels -jupyter起動 jupyter notebook **(3)プログラム編集ページの起動 [#q1ea3350] ***1.起動後のホーム画面からDLしたフォルダをたどって、web_tmining3dg.ipynbを開く [#hbf43353] #ref(3DGraph-pre.png,,40%)~ -開くと今回実行するプログラムが出てくる ~ #ref(3DGraph-pre2.png,,40%) -jupyterではプログラムを分割し、一行単位でプログラムの挙動を確認できる~ →システム開発をするときに便利 -今回はプログラムを1番~21番まで分割してあるので、順番に実行していく ***jupyterについて [#l7f5c18a] -Shift + Enterで実行できる -処理中は[*]となり、終わると左上に番号が出るのでそれまで待つ -プロンプトで動いているjupyterプログラムを停止or閉じると、リセットされ、1番目からやり直しする必要があるので注意 ~ ~ *プログラム実行手順 [#d2478c54] *プログラム実行手順 [#z218aebc] -基本はプログラムを一つずつ実行することになる[#ef1e755a] **実行前にやること、実行時のエラー対応+プログラムの補足説明を載せているので、その都度確認する [#a9c861ae] ~ ***2. 1番目のプログラム実行時 [#r53ffa6b] <!-- -importでno moduleエラーが出ると思うのでpip installしていく -jupyter画面左上の+でコードを書くセルを出せるので、そこに打ち込んでいく -入れるもの scipy requests_oauthlib ------------スクレイピング用 selenium chromedriver_binary bs4 lxml ------------自然言語処理用 emoji nltk MeCab ------------3Dグラフ用 networkx ------------Server.py起動用 flask flask_cors ->> 何かのモジュールがないと出るたびにpipで入れていく ~ ***3. 3つ目のプログラムを実行する前 [#v0c92b07] 配布フォルダ中のcsvを編集する #ref(3DGraph0.png,,40%) --属性データ(大学生・夫婦など)、検索キーワード、地名データ(東京・太閤山など)には検索したい好きなワードを入れる。(キーワードなしのときは「指定しない」を入れる) --4行目を編集したcsvがあるディレクトリにする~ 例 rd = pd.read_csv(C:/Users/iiela/Desktop/keywords.csv', encoding="shift-jis") ~ ***4. 4つ目のプログラム(スクレイピング)実行時 [#ibf3ac9e] --下のエラーが出る場合(pipのseleniumとchrome.exeのバージョンが違うエラー) selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 88 Current browser version is 92.0.4515.131 with binary path C:\Program Files (x86)\Google\Chrome\Application\chrome.exe 言われているバージョンをpip install(ver.88→ver.92へ) pip install chromedriver-binary==92.0.4515.131 おそらく赤字でエラーが出る ERROR: Could not find a version that satisfies the requirement chromedriver-binary==92.0.4515.131 (from versions: ~~~, 91.0.4472.101.0, 92.0.4515.43.0, 92.0.4515.107.0, 93.0.4577.15.0) ERROR: No matching distribution found for chromedriver-binary==92.0.4515.131 バージョンが列記されると思うので一番近いバージョンをインストール pip install chromedriver-binary==92.0.4515.107.0 ~ --逆パターンでchrome.exe(クローム本体)のver.が(例)92.0.4515.107.0でよりchromedriver-binaryの方が93で新しいということもある~ →その場合、chrome.exeのバージョンと同じchromedriver-binaryをインストールする pip install chromedriver-binary==92.0.4515.107.0 ------ ◎4行目について -csvに入れたキーワードで自動検索するソースコード~ -htmlで検索窓を実装しているタグ(qというnameタグ)を探し,そこにキーワードを打ち込んで検索ボタンを勝手に押すようにしている #ref(3DGraph1.png,,40%) ~ --#2のrankinng関数を呼び出し,検索結果のwebサイトのリンクとタイトルをスクレイピングする~ (→どちらもtF2Cxcというclassタグに入っているので,そこを見つけて取ってきている) ~ ------ #ref(3DGraph2.png,,40%) ~ ***5. 5つ目のプログラム [#r0f3d2c7] 保存したリンク先のWebサイトに飛び,文章をスクレイピングする~ →最終的に1つのテキストファイルに文章は保存される --linkdir,txtdirを添付フォルダ内のディレクトリにする ~ **この後もファイルの保存・呼び出しで、パスを指定する箇所がいくつかあるが [#q6dffff3] **1番下のファイル名は変えず、C:からWebsc3Dまでを自分のものに変更していく [#h08cacf2] ~ **(4)形態素解析、共起頻度計算 [#t7b5c738] 形態素解析:文章を意味のある最小単位の単語(形態素)に分解して分析する(自然言語処理の一種) ***6. 8つ目のプログラム実行前1~ [#hf17a28b] -Mecab(形態素分析を行うモジュール)をインストールする(リンク先の.exeのみ) https://github.com/ikegami-yukino/mecab/releases/tag/v0.996 -パスを通しておく(システム環境変数の編集で変数Pathを編集する)~ ~ #ref(3DGraph3-1.png,,60%)~ ~ 新規でmecab.exeがあるパスを追加する C:\Program Files\MeCab\bin\ ~ #ref(3DGraph3.png,,60%) -mecabと打った後、「形態素解析」と打ってみる~ 何か出てEOSが表示されていればOK -pythonでもmecabを試す --下図の4行を1行ずつ打ち込んで形態素解析結果が出ればOK import sys import MeCab m = MeCab.Tagger ("-Ochasen") print(m.parse ("東京特許許可局")) #ref(3DGraph3-2.png,,40%) ~ ***7. 8番目のプログラム実行前2→辞書の更新~ [#q0bc128b] #8でやっていること:文章から不必要な文字列を除去し,Mecabの辞書に基づいて単語単位に分割する ---- -辞書について --どのような単位で単語を区切るかなどのルールを記したもの --辞書はなるべく頻繁に更新したほうがいい~ デフォルトの辞書(2007年版?)では「進撃の巨人」に対して「進撃 の 巨人」という分析をしてしまう~ →辞書を日々更新することで流行語などを正確に1つの単語として分析してくれる インストールしたMecabには古い辞書しか入っていないので、NEologdという新しい辞書を追加する ---- --C:\Program Files\MeCab\dic 内に配布フォルダ内dicの中のneologdをコピーする #ref(3DGraph4.png,,40%) --Program Files/MeCab/etcの中にあるmecabrcをメモ帳で開き,下の一行を追加する ; userdic = /home/foo/bar/user.dic userdic = C:\Program Files\MeCab\dic\neologd\NEologd.20200820-u.dic ***8. mecabrcを上書き保存する際、アクセス許可がないという旨のエラーが出るとき [#u99aa8e9] 右クリックでmecabrcのプロパティを開き、Usersの「書き込み」にチェックを入れる #ref(3DGraph4-1.png,,60%) ***12番目のプログラムの補足~ [#r0608430] 隣接行列を生成(まだ要素は0のまま)~ -3Dグラフの基となる -行の単語から列の単語に向かって矢印が描かれ,値がエッジ(辺)の太さになる ***13番目の補足[#tecdfe58] 共起頻度を計算する -word_list(重複している単語リスト)を基に順序関係を見る #ref(3DGraph5.png,,40%) 例えば、単語'あ'の次に'う'が来ているので隣接行列の'あ'行'う'列の要素に+1される~ (文章中の単語'あ'から'う'が1回共起されたとみなす) ***15番目の補足 [#pde39fbb] --全ての行の共起頻度の合計を計算する --合計値の大きい順に単語を並び替える(列に対しても同じ操作をする) --上位数十件(DfNumで調整)の単語だけ切り取った隣接行列を作る ***16番目の補足 [#v604d322] --単語の重み(正規化した共起頻度)を出す ***17番目の補足 [#bb94ca83] --閾値以下の単語を除外して,新しい隣接行列を作る **(5)Jupyterで3Dグラフを開く [#we4ecc57] ***18番目の補足~ [#db7f2224] 今pandasのデータフレーム型になっている隣接行列をpythonの辞書型に変換する~ →この辞書を参考に3Dグラフが作られる --"nodes"にはノード(頂点)に入れる単語の情報が入る(csvのキーワードになっている単語だけ赤色になるなど) --"links"にはエッジ(辺)の情報(矢印の出発ノードから到着ノード,辺の太さweight(単語間の共起頻度など)が入る -19番目の補足~ 辞書型のデータをjson形式にする --サーバとデータをやり取りするときはjson形式にすることが多い -20,21番目の補足~ サーバ経由でデータを送って,htmlで3Dグラフを描画する ***Internet Explorerで開かれる場合、#21_2と#21_3を使ってデフォルトで開くブラウザを変更する [#m840cf24] BackgroundBrowser()の中にはchrome.exeが保存されているパスを指定する (windows画面左下でchrome.exeを検索する)
テキスト整形のルールを表示する