技術メモ
このサイトはスクレイピング・自然言語処理・3Dグラフをもとに作成しています。
行うこと
- WEBサイトから文章を自動取得(スクレイピング)
- 自然言語処理(形態素解析)で取得した文章を単語に分解
- 単語間の共起頻度を計算し、隣接行列を作成する
- 隣接行列から3Dグラフを生成する
キーワード
- スクレイピング
- Webサイトから何かしらのデータを自動で取ってくる技術のこと
- テキストマイニング
- 文章中の単語どうしのつながりなどを分析し、有用な情報を見つける(マイニングする)こと
- Jupyter notebook
- ブラウザ上で開発する統合開発環境
- プログラム(主にPython)を対話的に実行できる
前準備
(1)添付フォルダのダウンロード
#ref(): File not found: "Websc3D.zip" at page "Jupyter notebook による検索から3Dグラフ構築"
#ref(): File not found: "neologd.zip" at page "Jupyter notebook による検索から3Dグラフ構築"
フォルダ内のファイルについて
- keywords.csv
- スクレイピングする際に必要なキーワードを入れるcsvファイル
- stopwprd.txt
- 4つのjavascript(js)ファイル
- Server.py
- Jupyterで作成したグラフ情報をhtmlに送るためのもの
- web3D.html
- web_tmining3dg.jpynb
- (neologd内)NEologd.20200820-u.dic
(2)pythonからjupyterインストール
Anacondaを使っている場合
Anacondaプロンプトを開き、以下の手順でjupyterをインストール
(3)プログラム編集ページの起動
1.起動後のホーム画面からDLしたフォルダ(Websc3Dgraph)をたどって、web_tmining3dg.ipynbを開く
- 開くと今回実行するプログラムが表示される
- jupyterではプログラムを分割し、一行単位でプログラムの挙動を確認できる
→システム開発(or誰かが作ったプログラムの確認)をするときに便利
- 今回はプログラムを20処理分に分割してあるので、順番に実行していく
プログラム実行手順
操作方法と注意事項
- Shift + Enterで実行できる
- 処理中は左上のマークが[*]となり、終わると[1]のような番号が出るのでそれまで待つ
- 実行のたびに番号が加算されていく(番号を頼りにどこまで実行したかを把握)
- jupyterを動かしているプロンプトで「Ctrl + C」orプロンプトを閉じると、カーネルがリセットされ、1番目からやり直しする必要があるので注意
- 基本はプログラムを一つずつ実行することになる
- コメントアウトに実行順が書かれている
- 実行前にやること、実行時のエラー対応、処理の補足説明を載せているので、その都度確認する
#1 実行時
- requirements.txt内に記載のモジュールをpipインストール
- 実行中に「No module named ~」と出るなら追加インストール
!pip install ~
#4の補足
- 以下のようなcsvを読み込んでいる
- 属性データには「大学生・夫婦」などの人・物、検索キーワードには検索したいワード(大学 バイトなど)、地名データには地名(東京・太閤山など)を入れる。キーワードなしのときは「指定しない」を入れる
- これらのキーワードをもとにGoogle検索→スクレイピングしていく
#5(スクレイピング)実行時
- 下のようなエラーが出る場合(ChromeでJupyterを開いた場合)
- ChromeDriverのバージョンがChromeブラウザよりも古いことで起こる
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 (88と92で異なっている)
Cheomeブラウザと同じバージョンを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 (2023/01現在だとver108.X.X.Xあたり?)
- 逆パターンでChromeDriver(ver.93)がChromeブラウザ(ver.92.0.4515.107.0)よりも新しい場合がある
#5の補足
- csvに入れたキーワードで自動検索する処理を行う
- GoogleトップのHTMLで検索窓を実装しているタグ(qというnameタグ)を探し,そこにキーワードを打ち込んで検索ボタンを勝手に押すようにしている(「検証」で確認できる)
- #3のrankinng関数を呼び出し,検索結果のwebサイトのリンクとタイトルをスクレイピングする
(→どちらもtF2Cxcというclassタグに入っているので,そこを見つけて取ってきている)
#6の補足
- 保存したリンク先(links.txt)のWebサイトに飛び,文章をスクレイピングする
- 最終的に1つのテキストファイルに文章が保存される(webtext.txt)
#8の実行前にやること
MeCabを試す(ここは飛ばしても良い)
- 試しにmecabと打った後、「形態素解析」と打ってみる
- pythonでもmecabを試す
#8の実行前にやること2(辞書の更新)
#8でやっていること:文章から不必要な文字列を除去し,Mecabの辞書に基づいて単語単位に分割する
補足(辞書(dic)について)
- どのような単位で単語を区切るかなどのルールを記したもの
- 辞書はなるべく頻繁に更新したほうがいい
- デフォルトの辞書(2007年版?)では「進撃の巨人」に対して「進撃 の 巨人」という分析をしてしまう
- 辞書を日々更新することで流行語などを正確に1つの単語として分析してくれる
- インストールしたMecabには古い辞書しか入っていないので、NEologdという新しい辞書を追加する
- C:\Program Files\MeCab\dic 内に配布フォルダ内dicの中のneologdをコピーする
#8エラー対応(mecabrcを上書き保存する際、「アクセス許可がない」という旨のメッセージが出るとき
- 右クリックでmecabrcのプロパティを開き、Usersの「書き込み」にチェックを入れる
#8の補足(形態素解析について)
- 形態素解析:文章を意味のある最小単位の単語(形態素)に分解し、単語間の関係性を分析(自然言語処理の一種)
- 形態素解析ツールは複数あるが、今回は「Mecab」を使用
#12補足~
- 3Dグラフの基となる
- 行の単語から列の単語に向かって矢印が描かれ,値がエッジ(辺)の太さになる
#13の補足
- 単語の共起頻度を計算する
- 共起の定義はいろいろあるが、ここでは文章の中で単語Aの後ろに単語Bが出てきたとき、「BがAに共起されたと」という捉え方をしている
- このとき隣接行列では(行)A→(列)Bの方向に+1される
- それが3DグラフでのノードAからノードBへの線(エッジ)と重み(共起頻度)となる
- word_list(重複している単語リスト)を基に単語の順序関係を見ている
- 上図の例では、単語'あ'の次に'う'が来ているので隣接行列の'あ'行'う'列の要素に+1される
- 文章中の単語'あ'から'う'が1回共起されたとみなす
#14の補足
- 全ての行の共起頻度の合計を計算する
- 合計値の大きい順に単語を並び替える(列に対しても同じ操作をする)
- 上位数十件(DfNumで調整)の単語だけ切り取った隣接行列を作る
#15の補足
#16の補足
#17の補足~
- 今pandasのデータフレーム型になっている隣接行列をpythonの辞書型に変換する
- "nodes"にはノード(頂点)に入れる単語の情報が入る
- "links"にはエッジ(辺)の情報(矢印の出発ノードから到着ノード,辺の太さweight(単語どうしの共起頻度など))が入る
#18の補足~
- 辞書型のデータをjson形式にする
- サーバにデータを送信する際、配列や辞書はjson形式に変換される場合が多い
#19,#20番目の補足~
- サーバ経由でデータを送って,htmlで3Dグラフを描画する
- Internet Explorerで開かれる場合、デフォルトで開くブラウザを変更する
- BackgroundBrowser()の中にはchrome.exeが保存されているパスを指定する(windows画面左下でchrome.exeを検索する)
ゼミ課題
- keyword.csvを編集して2単語以上でスクレイピング・3Dグラフ作成を行う
- csvを書き換えた後、#4から#20まで再び実行する
- 組み合わせは何でもあり
- 「属性データ+検索キーワード」「属性+地名+検索キー」でもOK
- 検索キーワードx2でも可能(この場合、検索キーワード列の中身は「単語A(半角スペース)単語Bのように入れる)