テキスト分析は 原文検索がサクサクできないとね

　
2022/08/21  この記事に関連する [**Part2:Word2Vec編**](https://qiita.com/hima2b4/items/ca1a4fa440acdedeb3dd) をアップしました。
***


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/34688c75-0207-811e-f41d-e3bbceb14e26.png)

## はじめに
[**前回記事**](https://qiita.com/hima2b4/items/54f734489ff8f4a13d07)で [**GiNZA**](https://pypi.org/project/ginza/)に「[**国語研長単位モデル**](https://github.com/megagonlabs/UD_Japanese-GSD/releases/tag/r2.9-NE)」を適用し、テキスト処理した単語を「自然言語可視化ライブラリ [**NLPLOT**](https://pypi.org/project/nlplot/)」に与えて、**頻出語グラフと共起ネットワーク** を描きました。

「[**国語研長単位モデル**](https://github.com/megagonlabs/UD_Japanese-GSD/releases/tag/r2.9-NE)」は、それはもうすばらしいのですが、テキスト処理には少々時間を要します。（400未満のレコードのデータで数分）

共起ネットワークやWordCloudを描いたり、原文検索を行う毎にテキスト処理を行うと、分析よりも待ち時間の方が長いんじゃないかという状況になります。これはよくありません。

テキストアナリティクスを効率的に進めるためには、テキスト情報を共起ネットワークなどで効果的に可視化し、ポイントを絞ったうえで原文を確認し・・・ということをサクサクできるようにしたい。。。
サクサク実行するには、「可視化や検索」のたびに「テキスト処理」は実行せず、「可視化や検索」は「テキスト処理」を行った結果を利用して実行するようにした方がよさそうです。

[**前回記事**](https://qiita.com/hima2b4/items/54f734489ff8f4a13d07)では、 [**GiNZA**](https://pypi.org/project/ginza/) と「[**国語研長単位モデル**](https://github.com/megagonlabs/UD_Japanese-GSD/releases/tag/r2.9-NE)」でテキスト処理（分かち書き）した結果をデータフレームに格納しましたので、原文検索をこの結果を利用して実行したいと思います。


## 実行したこと
>- Google Colabで実行しています。
>- テキストデータは、Excel表形式にまとめられたアンケート等を想定し、csvデータとしています。適用データは [前回記事](https://qiita.com/hima2b4/items/7125b15ad76b2f5c38e3) 同様、tweetデータ（csv）です。（※「再エネ」でtweet検索したつぶやきを [ついすぽ](https://chrome.google.com/webstore/detail/%E3%81%A4%E3%81%84%E3%81%99%E3%81%BD-tweet-export/imjojcgefiinokaclmifakpphkfeiddg?hl=ja) でcsvにエクスポートしたデータです。）

https://chrome.google.com/webstore/detail/ついすぽ-tweet-export/imjojcgefiinokaclmifakpphkfeiddg?hl=ja

以下、[**前回記事**](https://qiita.com/hima2b4/items/54f734489ff8f4a13d07)で実行した内容です。
>- 読込んだcsvデータをデータフレームに格納し、[**GiNZA**](https://pypi.org/project/ginza/)で行単位でテキスト処理した後、分かち書きの結果をデータフレームのカラムに反映しています。
>- 分かち書きした結果を「自然言語可視化ライブラリ [**NLPLOT**](https://pypi.org/project/nlplot/)」で取り込み、頻出語グラフと共起ネットワークを描いています。

今回は「頻出語グラフ」や「共起ネットワーク」に表示された単語をキーワードに原文検索を行います。
「共起ネットワーク」実行までの内容は、前回の記事を確認いただくとして、以下は原文検索の内容についてのみを触れるようにします。


## 原文検索

以下は、今回対象としたテキスト処理後のデータフレームの一部を表示したものです。
左端の「テキスト」カラムが原文、右端のー「 separate_words」カラムが分ち書きした結果となっています。
![467EFF93-16E5-42EB-8A2D-EF6A8FB3D1C4.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/d4b0128b-d62c-cf72-e0bc-7da76cb456df.jpeg)

まず、テキスト処理を実行したいデータフレームカラムの指定です。
GoogleColabのフォーム機能を利用し、フォームにカラム名の入力することにより指定できるようにしています。
今回のデータの場合、「テキスト」カラムが対象となりますので、’テキスト’と入力しています。

```Python:
#@title 意見カラムの名称は？ { run: "auto" }

column_name = 'テキスト' #@param {type:"raw"}
```

以下は、原文検索を実行するコードです。
先の通り、df['separate_words']には、[’再エネ’,’原発再稼働’,’断念’・・・]等、行毎に分かち書きした結果が格納されています。
Keywordは 2つ設定できるようにしており、df['separate_words'] にフォームに入力したKeywordが含まれている場合、その行の原文（df[column_name]に格納）を抽出し、データフレーム（dfa）に格納した後、1行づつNotebook内に表示させています。

```Python:
#@title Keyword による原文検索

Keyword1 = '基礎講座' #@param {type:"raw"}
Keyword2 = '原発再稼働' #@param {type:"raw"}

import re

# Keyword1を含む元文を検索
print('\n')
print('● [', Keyword1,'] 検索結果')
print('\n')
try:
  dfa=pd.DataFrame(df[column_name][df['separate_words'].apply(lambda x: Keyword1 in x)])
  for i in dfa[column_name]:
    print('\t✓',i)
except:
  print(Keyword1,'unknown keyword')
print('\n')
print('---------------------------------------------------------------------------------------------------------------------------------------------------------------')
print('\n')

# Keyword2を含む元文を検索
print('● [', Keyword2,'] 検索結果')
print('\n')
try:
  dfa=pd.DataFrame(df[column_name][df['separate_words'].apply(lambda x: Keyword2 in x)])
  for i in dfa[column_name]:
    print('\t✓',i)
except:
  print(Keyword2,'unknown keyword')
print('\n')
print('---------------------------------------------------------------------------------------------------------------------------------------------------------------')
```
以下は、検索の一例です。
![CF2D3915-4B7B-4AD9-A5CD-A0D660E335F0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/7373f6d5-b699-f2f6-9f2f-dbc4c57a8174.jpeg)
次は、**AND検索**です。
先との違いは、df['separate_words'] にフォームに入力した2つのKeywordが含まれている、その行の原文（df[column_name]に格納）を抽出し、データフレーム（dfa）に格納した後、1行づつNotebook内に表示させるという内容です。

```Python:
#@title Keyword のANDによる原文検索

Keyword_A1 = '再エネ' #@param {type:"raw"}
Keyword_A2 = 'サウジアラビア' #@param {type:"raw"}

import re

# Keyword1とKeyword2 を含む元文を検索
print('\n')
print('● [', Keyword_A1,'] ＆ [',Keyword_A2,'] 検索結果')
print('\n')
try:
  dfa=pd.DataFrame(df[column_name][df['separate_words'].apply(lambda x: Keyword_A1 and Keyword_A2 in x)])
  for i in dfa[column_name]:
    print('\t✓',i)
except:
  print('unknown keyword')
print('\n')
print('---------------------------------------------------------------------------------------------------------------------------------------------------------------')
```
以下は、前回描いた共起ネットワークです。
![1D706616-CB45-4B64-BE96-C36AF966718C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/5fb038d0-baa1-c0c8-feda-f41202e7a143.jpeg)
このなかで「再エネ」と「サウジアラビア」が気になりましたので、原文を検索してみました。
![ED366546-FBD0-43E4-B2F7-5B2902E3589F.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/3c91fc48-016a-caef-114c-a2b60181479b.jpeg)
サウジアラビアって、再エネ進んでるんですね。

## 最後に

df['原文カラム'][df['分ち書き'].apply(lambda x: 'キーワード' in x)])

上記1行コードだけでNotebookに検索結果は表示されましたが、表示範囲、表示数は制限されていました。制限を広げると検索原文はすべてNotebookに表示されたのですが、中央揃え表示となってしまいました。

なので、上記1行コードの結果をデータフレームに格納し、printで検索原文を表示すると、今度は右揃え表示に。。。
次に、for文で1行づつprintで検索原文をNotebookに表示すると、ようやく左揃え表示となりました。

うーん、もっといい方法があるような気はしますが、サクサクと原文検索は実行できるようになりましたので、結果オーライとしたいと思います。

それにしても、[**GiNZA**](https://pypi.org/project/ginza/) + [**国語研長単位モデル**](https://github.com/megagonlabs/UD_Japanese-GSD/releases/tag/r2.9-NE) はいいです。サクサク原文検索の目処もたちましたのでテキスト分析がはかどりそうです。

## 参考

https://www.takapy.work/entry/2020/05/17/192947#co-occurrence-networks

https://srad.jp/~yasuoka/journal/653385/

https://www.anlp.jp/proceedings/annual_meeting/2022/pdf_dir/PH4-3.pdf

https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Data-Science%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-Python%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E5%85%A5%E9%96%80-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E5%89%9B%E5%8F%B2/dp/4065274109/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=

https://qiita.com/hima2b4/items/5619e617c34f588b418a

https://qiita.com/hima2b4/items/53ae54a7cd5ee08529fb

https://qiita.com/hima2b4/items/97cf372f81bc6aac4359

https://qiita.com/hima2b4/items/7125b15ad76b2f5c38e3