Translate

ラベル テキストマイニング の投稿を表示しています。 すべての投稿を表示
ラベル テキストマイニング の投稿を表示しています。 すべての投稿を表示
2023年7月16日

Goolge Colabでお手軽テキストマイニング(日本語前処理)

象と散歩:pythonで遊ぶ 

Google Colaboratory は、Google アカウントさえ持っていれば、Python を実行できる素晴らしい環境です。準備やインストールが不要で、手軽に Pythonプログラミングを楽しめます。

テキストデータの分析(アンケートのフリーコメントや問い合わせ内容など)も、Google Colaboratory の環境を使えば、手軽にPythonでテキストマイニングができます。

今回は、テキストの前処理に関する2つのステップについて説明します。

  1. テキストの読み込み テキストファイル、CSV、Excel ファイルなどに保存されたテキストデータを読み込む方法です
  2. 読み込んだテキストの正規化 テキストの表記の揺れを少なくして文章を分析しやすい形式に変換します

1. 対象ファイルを読み込む

3つの方法でテキストデータを読み込む方法について説明します。2番目と3番目の方法では、pandasパッケージを使用します。

  1. テキストファイルの読み込み テキストファイルの中にあるテキストデータを読み込む方法です。open()関数を使用してファイルを開き、ファイルの中身をテキストデータとして抽出します。
  2. CSVファイルの読み込み CSVファイルに格納されたテキストデータを読み込む方法です。pandasパッケージのread_csv()関数を使用します。この関数にはCSVファイルのパスを指定し、データをデータフレームとして読み込むことができます。
  3. Excelファイルの読み込み Excelファイルに格納されたテキストデータを読み込む方法です。pandasパッケージのread_excel()関数を使用します。この関数にはExcelファイルのパスを指定し、データをデータフレームとして読み込むことができます。

ファイルのアップロード

Google Colaboratory ではGoogleドライブをマウントして利用することもできますが、下例は、ファイルをセッションストレージ(セッションが接続されている間だけ使えるストレージ)の "/content/sample_data" にアップロードする方法です。

  1. Colabの左端にあるファイルアイコンをクリック(下図オレンジ枠)
  2. sample_dataフォルダを開く
  3. セッションストレージにアップロード(下図グリーン枠)

ドラッグアンドドロップでもアップロードできます。

Google Colaboratory:ファイルのアップロード

アップロードするsample.txtの内容は下記のようなものです。

<sample.txt>
甘くてフルーティーな味で最高
チョコレートとストロベリーの組み合わせが最高!
香りが良くて食べやすい!おすすめです。
子供たちも大喜びのおいしさ!リピート決定。
さわやかな酸味と濃厚なチョコのバランスが絶妙。

エンコーディング

テキストデータを読み込む際には、エンコード(Encoding)を指定する必要があります。エンコードは、テキストデータのバイト列(バイナリデータ)への変換方法や規則を指定するものです。日本語などの2バイト文字データを正しく扱うためには、適切なエンコードを指定する必要があります。

一般的なエンコーディングとしては、以下のようなものがあります。

  • UTF-8: 広く使用されるUnicodeエンコーディングで、多くのプラットフォームやシステムでサポートされています。MacやLinux環境でよく使われます。
  • Shift-JIS: 主にWindows環境で使われる日本語エンコーディングです。

下例は、/content/sample_data/にあるsample.txtを読み込むコードです。file_pathに読み込むテキストをフルパスで指定しています。パスは当該フォルダを右クリックして"パスをコピー"で取得できます。

Google Colaboratory:ファイルパスの取得

UTF-8のファイルを指定する場合です。変数 textに読み込んだ内容を格納します。

file_path = '/content/sample_data/sample.txt'
with open(file_path, 'r', encoding='utf-8') as file:
    text = file.read()

print(text)

Shift-JISの場合は下記のようになります。

file_path = '/content/sample_data/sample.txt'
with open(file_path, 'r', encoding='shift_jis') as file:
    text = file.read()

print(text)

print(tex)の結果です。

甘くてフルーティーな味で最高
チョコレートとストロベリーの組み合わせが最高!
香りが良くて食べやすい!おすすめです。
子供たちも大喜びのおいしさ!リピート決定。
さわやかな酸味と濃厚なチョコのバランスが絶妙。

エンコードがわからない場合

chardetは、Pythonで利用できるエンコーディング推定ライブラリです。テキストのエンコードがわからない場合は、chardetでエンコードを確認してファイルを読み込みます。

下例では、sample.txtを読み込んで何のエンコードかを調べた結果をfle_encordingに格納し、そのエンコーディングでファイルを再度読み込みます。

import chardet

# ファイルのエンコーディング情報を取得
file_path = '/content/sample_data/sample.txt'
with open(file_path, 'rb') as f:
    file_encording= chardet.detect(f.read())['encoding']

print(file_encording) #エンコード情報

# 取得したエンコーディング情報でファイルを読み込む
with open(file_path, 'r', encoding=file_encording) as f:
    text = f.read()

print(text)

CSVからの読み込み

CSV(カンマ区切り)の場合は、pandasのread_csv()関数を使って列名を指定してデータを読み込みます。

読み込むcsvは、1列目の列名が「no.」、2列目の列名が「回答」です。

<sample.csv>
no.,回答
1,甘くてフルーティーな味で最高
2,チョコレートとストロベリーの組み合わせが最高!
3,香りが良くて食べやすい!おすすめです。
4,子供たちも大喜びのおいしさ!リピート決定。
5,さわやかな酸味と濃厚なチョコのバランスが絶妙。

下例は、上記のCSVファイルのうち列名が「回答」となっている列を取得するコードです。改行区切りで変数 textに格納します。

import chardet
import pandas as pd

# ファイルのエンコーディング情報を取得
file_path = '/content/sample_data/sample.csv'
with open(file_path, 'rb') as f:
    file_encording= chardet.detect(f.read())['encoding']

# CSVファイルを読み込んでテキストデータを抽出
df = pd.read_csv(file_path, encoding=file_encording)
text = '\n'.join(df["回答"])  # 回答列名を適宜変更してください

print(text)

print(tex)の結果です。

甘くてフルーティーな味で最高
チョコレートとストロベリーの組み合わせが最高!
香りが良くて食べやすい!おすすめです。
子供たちも大喜びのおいしさ!リピート決定。
さわやかな酸味と濃厚なチョコのバランスが絶妙。

Excelから読み込む場合

Excelファイルから直接読み込むことも可能です。pandasのread_excel()関数を使います。シート名と列名の指定が必要です。

import chardet
import pandas as pd

# ファイルのエンコーディング情報を取得
file_path = '/content/sample_data/sample.xlsx'
with open(file_path, 'rb') as f:
    file_encording= chardet.detect(f.read())['encoding']

# Excelファイルを読み込んでテキストデータを抽出
sheet_name = 'シート1'  # 読み込むシートの名前を指定してください
df = pd.read_excel(file_path, sheet_name=sheet_name, encoding=file_encoding)
text = '\n'.join(df["回答"])  # 回答列名を適宜変更してください

print(text)

print(tex)の結果です。

甘くてフルーティーな味で最高
チョコレートとストロベリーの組み合わせが最高!
香りが良くて食べやすい!おすすめです。
子供たちも大喜びのおいしさ!リピート決定。
さわやかな酸味と濃厚なチョコのバランスが絶妙。

2. テキストファイルの正規化

読み込んだテキストの正規化(表記の揺れの是正)を行います。正規化=文字の統一化です。

NFKC(Normalization Form KC)は、Unicodeの正規化形式の一つであり、日本語のテキストに特に有用です。NFKC形式では、以下のような処理が行われます:

  • 半角カタカナ→全角カタカナ
  • 全角英数字記号の半角化
  • 互換性のある文字の置換(①→1, ㋿→令和)

もうひとつ日本語表記の揺れを補正するライブラリとしてneologdnがあります。mecab と neologdn辞書での形態素解析をする前の正規化(表記の揺れの是正)として推奨されていますが、それ以外のケースでも有用です。以下のような処理が行われます。

  • 半角カタカナ→全角カタカナ
  • 全角英数字記号の半角化
  • 連続した長音記号を削除
  • 文字と文字の間のスペースを削除

実際に2つの正規化処理でどのようにテキストが変換されるのかをみていきましょう。


NFKCで正規化

NFKCの特徴は、互換性のある文字の置換です。①、㋿、㌢ といった文字が、1、令和、センチなどに変換されます。

import unicodedata

text = "カタカナカタカナ ABCABC ! ! 123 123 ①テキスト マイニング わーーーい 1984〜2000 ㋿ ㌢"

normalized_text = unicodedata.normalize('NFKC', text)
print(normalized_text)

実行すると下記の結果が出力されます。

カタカナカタカナ ABCABC ! ! 123 123 1テキスト マイニング わーーーい 1984〜2000 令和 センチ

neologdnで正規化

neologdnを使うにはパッケージのインストールが必要です。neologdnでは、"テキスト マイニング"→"テキストマイニング"と文字間のスペースが削除されたり、連続する長音の削除、チルダの削除などが行われます。

!pip install neologdn

import neologdn

text = "カタカナカタカナ ABCABC ! ! 123 123 ①テキスト マイニング わーーーい 1984〜2000 ㋿ ㌢"
normalized_text = neologdn.normalize(text)

print(normalized_text)

実行すると下記の結果が出力されます。

カタカナカタカナABCABC ! ! 123 123 ①テキストマイニングわーい19842000 ㋿㌢

NFKCとneologdnでテキストを正規化する

NFKCとneologdnには同じ正規化処理もあれば異なる処理もあるので、二つを組み合わせて実施しましょう。NKFCで正規化をした結果をneologdnで正規化します。

!pip install neologdn

import unicodedata
import neologdn

text = "カタカナカタカナ ABCABC ! ! 123 123 ①テキスト マイニング わーーーい 1984〜2000 ㋿ ㌢"

normalized_text = neologdn.normalize(unicodedata.normalize('NFKC', text))

print(normalized_text)

実行すると下記の結果が出力されます。

カタカナカタカナABCABC ! ! 123 123 1テキストマイニングわーい19842000令和センチ

読み込んだテキストを正規化する

sample.txtは正規化しても結果は変わりませんが、テキストファイルを読み込んで正規化するプログラムの例が下記になります。

!pip install neologdn

import chardet
import unicodedata
import neologdn

# ファイルのエンコーディング情報を取得
file_path = '/content/sample_data/sample.txt'
with open(file_path, 'rb') as f:
    file_encording= chardet.detect(f.read())['encoding']

# 取得したエンコーディング情報でファイルを読み込む
with open(file_path, 'r', encoding=file_encording) as f:
    text = f.read()
    
# テキストの正規化
normalized_text = neologdn.normalize(unicodedata.normalize('NFKC', text))

print(normalized_text)

正規化されたテキスト文章が、変数 normalized_text に格納されます。

次回は、日本語の文章をテキストマイニングする前処理として重要な形態素解析(単語や文節で区切り、品詞等を判別する)について説明していきたいと思います。

2011年11月18日

Tiny TextMinerでテキストマイニング(その2)

随分と前にTTM: TinyTextMiner でテキストマイニングで、無料のテキストマイニングツールについて紹介をしましたが、最近になってまた使ってみています。TTMは、辞書機能を備えているので、形態素解析器の辞書にない語彙をキーワードとして登録したり、同義語の定義をしたり、不要な語を削除することが容易にできます。テキストマイニングで一番大切な作業はこの辞書の整備だったりもします。

Tiny Text Miner については、以前下記のように紹介しています。
Tiny TextMinerとは、大阪大学大学院経済学研究科 松村研究所の松村真宏氏が公開しているフリーのテキストマイニングツールです。形態素解析にMeCabを利用して、単語の出現頻度と出現件数(単語を含むサンプル件数)を出力します。また係り受け解析のCaboChaと連携して係り受けによる、出現頻度と出現件数を出力することもできます。
現時点での最新版は、バージョン 0.75 (for Win)です。

Tiny Text Minerのインストール

TTMのインストール先は任意です。TTMは、形態素解析器としてMeCabを利用していますので、日本語のテキストマイニングをするのであればMeCabのインストールは必須です。また係受け分析も行うのであれば、CaboChaのインストールが必要になります。

ソフト名ダウンロード先補足
Tiny TextMinerttm.exeTiny TextMiner本体
MeCabmecab-0.98形態素解析器
文字コードは「Shift-JIS」を選択
CaboChacabocha-0.53.exe係り受け解析器

データクレンジング

本家のサイトでもFAQとして記載されているものもありますが、Tiny Text Minerを使う上で、事前にテキストマイニング対象のテキストをクレンジングする必要があります。
  1. 空白行の削除
  2. Excelセル内の改行の削除
  3. 半角文字を全角に小文字を大文字に変換
  4. 機種依存文字の削除
a. 空白行の削除

TTMでは空白行があると処理できませんので、対象テキストで空白のものがあれば削除します。

b. Excelセル内の改行の削除

Excelセル内で改行されている(Alt+Enterでセル内で改行)場合も正しく処理できません。TTMのFAQでは、Excelの=CLEAN()関数を利用して改行を削除とありますが、多くの場合、改行の位置は文字区切りの位置でもあります。置換で改行をスペースに変換した方が、語の区切り目を正しく認識してくれます。またスペースは全角でなければ語の区切り文字として認識してくれません。Windowsでは改行がCTL+Jで入力できるので置換と検索で改行を全角文字に置換します。


改行の入力
検索する文字列(N)のリストボックスにカーソルがある状態でCtrlキーとJを同時に押します。見た目上は何も変わらないので複数回入力してしまうと変換できなくなってしまうので、正しく変換されないと思ったら検索する文字列で違う文字を入力するか、Excelを再起動してやり直してください。

全角スペースの入力
置換語の文字列(E)のリストボックスにカーソルがある状態で、全角スペースを入力します。

テキストが入力されている列を選択して検索と置換で「すべて置換」とすると改行が全角スペースに変換されます。


半角と全角スペースで置換した場合と、=CLEAN()関数でスペースがなしと場合で、Tiny TextMinerでどのように形態素解析されるかを試してみます。

zou.csv(入力データ)
1アフリカゾウ インドゾウ← アフリカゾウとインドゾウの間は半角スペース
1アフリカゾウ インドゾウ← アフリカゾウとインドゾウの間は全角スペース
1アフリカゾウインドゾウ← アフリカゾウとインドゾウの間にスペースなし

zou_ttm1.csv(出現頻度)
タグ品詞品詞細分類出現頻度
1インド|ゾウ複合名詞複合名詞1
1アフリカ|ゾウ|インド|ゾウ複合名詞複合名詞1
1アフリカ|ゾウ複合名詞複合名詞1

半角スペースの行が正しく処理されなかったため、インド|ゾウ、アフリカ|ゾウの出現頻度は1となっています。また入力3行目がアフリカゾウとインドゾウの間の改行を=CLEAN()関数でスペースを削除した結果だとすると、アフリカ|ゾウ|インド|ゾウという1語になってしまっていることがわかります。

c. 半角文字を全角に小文字を大文字に変換

英数数字、記号を日本語として扱うために全角変換をします。勿論、上記の半角スペースも全角スペースに変換されます。変換は、Excelの関数で簡単にできます。

=JIS()  半角文字を全角に変換する
=UPPER()  大文字に変換する

上記を組み合わせて=UPEER(JIS(A2))のようにすれば全角大文字変換ができます。


c. 機種依存文字を削除する

Tiny Text Minerでは、機種依存文字があると正しく処理されないために機種依存文字を除く必要があります。代表的な機種依存文字は下記に示しますが、丸数字やローマ数字は、一般的によく利用されているので気を付ける必要があります。

代表的な機種依存文字
機種依存文字を削除するにはExcelの=SUBSTITUTE()を使って削除することもできますが、かなりネストが深い構造になります。

①~⑳までを削除する
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B2,"①",""),"②",""),"③",""),"④",""),"⑤",""),"⑥",""),"⑦",""),"⑧",""),"⑨",""),"⑩",""),"⑪",""),"⑫",""),"⑬",""),"⑭",""),"⑮",""),"⑯",""),"⑰",""),"⑱",""),"⑲",""),"⑳","")

Ⅰ~Ⅹまでを削除する
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B3,"Ⅰ",""),"Ⅱ",""),"Ⅲ",""),"Ⅳ",""),"Ⅴ",""),"Ⅵ",""),"Ⅶ",""),"Ⅷ",""),"Ⅸ",""),"Ⅹ","")


※簡単にできる方法があれば教えてください。

実行上の注意点

入力データのクレンジングが終わり、これでやっとTiny Text Minerを実行できるようになりますが、使用上の注意事項が幾つかあります。

出力フォルダ
Windows7環境だと出力フォルダに指定するフォルダ名が日本語パスがあると指定できません。入力ファイルや辞書ファイルのパスでは問題ありません。


抽出される語は1,000件まで
TTMのクロス集計表(ttm3~ttm6)で抽出される語は1,000語までです。出力結果が1,000語を超える場合には、語の出現頻度/出現件数の最小値を2件以上にして調整しなければ解析対象に全語が含まれなくなります。

不要語に指定するのは原型
不要語を削除する場合には、TTMで形態素解析された結果の語(原型)を指定しなければなりません。下記の場合、「行った」を不要語とした場合は、原型の「行く」を指定しないと削除できません。

zou.csv(入力データ)
1象を見に動物園に行った
1動物園にキリンを見に行った

zou_ttm1.csv(出現頻度)
タグ品詞品詞細分類出現頻度
1動物|園複合名詞複合名詞2
1見る動詞自立1
1行く動詞自立2
1キリン名詞一般1
1名詞一般1

Let's Try Tiny TextMiner

2009年12月8日

簡単テキストマイニング ExcelでKWIC (その3)

ExcelでKWICを実現する「簡単テキストマイニング ExcelでKWIC」、「簡単テキストマイニング ExcelでKWIC(その2)」の続きとなります。KWICとは、KeyWord In Context の略で、キーワード前後の文章を抽出する技術です。

Excel KWIC

A B C D E F G
1 キーワード KWIC
2 文字数 20
3 出現位置 2
4
5 出現頻度 1st 2nd Befor KWD KWD After KWD 検索対象文章
6 2 1 51 キーワード前後の文章を抽出する技術です。 KWIC によって文脈を簡単に理解することができま KWICとは、KeyWord In Context の略で、キーワード前後の文章を抽出する技術です。KWICによって文脈を簡単に理解することができます。

前回は、F6セルのキーワードの後ろの文字列を取得するところまででした。今回は、キーワード前の文字列を取得します。

キーワード前も=mid()で文字列を切り出しますが、開始位置がキーワードのn文字分前となります。キーワードが2回目に出現した地点からB2(20文字)前は=C6-B2です。

=mid(G6,C6-$B$2,$B$2) ・・・①

しかし、上記でB2セルに60と入力すると開始位置が0以下(=52-60)でエラー(#VALUE!)となります。指定文字数(B2セル)がキーワード前の文字数よりも大きい場合は、1文字目からキーワード開始位置手前までの文字列を取得する必要があります。

=mid(G6,1,C6-1) ・・・②

このようにキーワード前の文字列が取得文字数よりも多いこと(開始位置-取得文字数>1)を確認してから、①か②を実行する必要があります。Excelでは条件分岐の=if()が利用できます。

=if(C6-$B$2>1,mid(G6,C6-$B$2,$B$2),mid(G6,1,C6-1))

次にB3セルに入力したキーワード出現位置によって開始位置を特定するために「簡単テキストマイニング ExcelでKWIC(その2)」で利用したindex()を同じ要領で利用します。

=if(index(B6:C6,$B$3)-$B$2>1,mid(G6,index(B6:C6,$B$3),$B$2),mid(G6,1,index(B6:C6,$B$3)-1))

これで完成です!

最初にも記載しましたが、今回のExcel KWICでは、文章の中でキーワードが複数回出現する場合の対応が冗長的な方法になってしまっています。今度、囓りかけたVBAを使って作成をしてみようと思いますが、Excelでも簡単にKWICが実現できるということを理解していただければ幸いです。

index()に関しては、利用例を下記に再掲しておきます。
A
B
C
D
E
1
アオリイカ
コウイカ
カミナリイカ
ジンドウイカ
ミミイカ
2
3

=index(A1:E1,2)

とすると、A1:E1までの中で2番目の内容が返ってくるので「コウイカ」となります。

=index(A1:E1,5)

は、ミミイカです。





2009年12月4日

簡単テキストマイニング ExcelでKWIC (その2)

ExcelでKWICを実現する「簡単テキストマイニング ExcelでKWIC」の続きです。
KWICとは、KeyWord In Context の略で、キーワード前後の文章を抽出する技術です。

Excel KWIC

A B C D E F G
1 キーワード KWIC
2 文字数 20
3 出現位置 2
4
5 出現頻度 1st 2nd Befor KWD KWD After KWD 検索対象文章
6 2 1 51 キーワード前後の文章を抽出する技術です。 KWIC によって文脈を簡単に理解することができま KWICとは、KeyWord In Context の略で、キーワード前後の文章を抽出する技術です。KWICによって文脈を簡単に理解することができます。

前回は、A6セルのキーワードの出現頻度までだったので、今回はキーワードの出現位置からになります。

B6はキーワードが最初に出現する位置で、C6が2番目に出現する位置になります。ここで求めたキーワード開始位置を使ってD6、F6でキーワード前後の文章を表示します。

指定した文字列が出現する位置を求めるには、Excelのfind()を利用します。

B6セルの説明

B1で指定したキーワードがG6の中で最初に出現する開始位置です。検索開始は1文字目からです。
=find($B$1,G6,1)

上記だとB1に指定したキーワードがG6で出現しない場合にエラー(#VALUE!)となりますので、iferror()関数を使って、キーワード存在しない場合に"-"を表記させます。

=iferror(find($B$1,G6,1),"-")

C6セルの説明

B1で指定したキーワードがG6の中で2番目に出現する開始位置です。言い換えると最初にキーワードが出現した以降で、次に最初に出現する位置となります。

最初に来ワードが出現した位置はB6です。しかし、

=find($B$1,G6,B6) ・・・① 1文字目から検索

と記載するとB6の位置からキーワードが始まっているので、B6と同じ結果になってしまいます。B6の位置から+1する必要があります。若しくは厳密にキーワードの長さ分を加算します。

=find($B$1,G6,B6+1) ・・・② 1+1=2文字目から検索
=find($B$1,G6,B6+len($B$1) ・・・③ 1+4=5文字目から検索

可視化するとこんな感じです。
K W I C

そしてエラーの場合には”-“を表示するという処理を付け加えると下記のようになります。

=iferror(find($B$1,G6,B6+len($B$1)),"-")

次に本題のキーワード前後の文章の表示です。キーワード後の方が簡単なので先にF6セルの説明をします。

F6セルの説明

文字列の一部を切り取るには、mid(文字列,開始位置,文字数)関数を使用します。

A B C
1 アオリイカ、コウイカ、カミナリイカ、ジンドウイカ、ミミイカ
2
3

上記のA1セルの中で"コウイカ"は、7文字目から始まり、4文字です。

Excelで表記すると、下記のようになります。

キーワード後の文字列を切り出すためにも、このmid()関数を使用します。キーワードの直後からB2セルで指定した分だけG6から切り出します。切り出し開始位置は、1番目のキーワードであれば、B6にキーワードの長さを加算した、1+4=5文字目になります。

=mid(G6,B6+len($B$1),$B$2)

2番目の出現位置からは

=mid(G6,C6+len($B$1),$B$2)

となります。

ここからが小技です。今回の仕様では、B3に"1"か"2"と入れることによって、キーワードの出現位置が1番目か、2番目かを選択できるようにしています。これをindex()関数を使って実現しています。

A B C D E
1 アオリイカ コウイカ カミナリイカ ジンドウイカ ミミイカ
2
3

=index(A1:E1,2)

とすると、A1:E1までの中で2番目の内容が返ってくるので「コウイカ」となります。

=index(A1:E1,5)

は、ミミイカです。

Excel KWICでは、

=index(B6:C6,$B$3)

で、B3セルに指定したn番目のキーワード開始位置を求めることができます。

=mid(G6,index(B6:C6,$B$3)+len($B$1),$B$2)

これにエラーの場合は、何も表示しないという処理を加えると

=iferror(mid(G6,index(B6:C6,$B$3)+len($B$1),$B$2),"")

となります。





2009年12月1日

簡単テキストマイニング ExcelでKWIC

KWICとは、KeyWord In Context の略で、キーワード前後の文章を抽出する技術です。KWICによって文脈を簡単に理解することができます。これはテキストマイニングの技術としてだけではなく、Yahoo!やGoogleなどの検索結果にも利用されています。例えば下記はGoogleで"NPSとは"で検索した結果になります。
2008年7月19日 ... そして、推奨者から批判者の比率を減算したものが、ネットプロモータースコアー(NPS)です。つまり、30%が推奨者で、20%が批判者であれば、NPSは10%となります。もし推奨者が20%で批判者が30%であれば、NPSは-10%となります。 ...
このようにキーワードを中心とした文章が掲載されていると全体を読まなくとも指定したキーワード(特定の語彙)がどのように使われているかを理解することができます。KWICを使った検索機能は、日本語では難しい係受け分析を使用するよりも、キーワード(特定の語彙)の使われ方を知る有効な手段です。但し、KWICでは、「パンが美味しい」と記載されている文章は5件というような定量的表記はできません。

EXCELでKWIC

以前、紹介したTTM: Tiny Text Minerでは、このKWICの機能を有していません。それを補う場合にEXCELで簡易的にKWICを実行してみましょう。

EXCEL KWICの完成形は下記のようになりますが、キーワードが複数回出現する文章の対応がいまひとつです。時間があれば今度はVBAで作成してみようと思います。

A B C D E F G
1 キーワード KWIC
2 文字数 20
3 出現位置 2
4
5 出現頻度 1st 2nd Befor KWD KWD After KWD 検索対象文章
6 2 1 51 キーワード前後の文章を抽出する技術です。 KWIC によって文脈を簡単に理解することができま KWICとは、KeyWord In Context の略で、キーワード前後の文章を抽出する技術です。KWICによって文脈を簡単に理解することができます。

項目説明:

入力項目

B1 検索対象とするキーワードを入力します
B2 キーワード前後の表示する文字数を指定します
B3 何番目に出現するキーワードを対象とするかを入力します
G6 検索対象とする文章

出力項目

A6 B1で入力したキーワードがG6の文章の中に何回出現するかを表示します
B6 G6の文章の中でB1で指定したキーワードが最初に出現する位置を表示します
C6 G6の文章の中でB1で指定したキーワードが2番目に出現する位置を表示します
D6 B2で指定した文字数分、キーワード前の文章を表示します
E6 B1で指定したキーワードを表示します
F6 B2で指定した文字数分、キーワード後の文章を表示します

では、順次説明をしていきます。

キーワードの出現頻度:

今回のEXCEL KWICでは、複数回出現するキーワードの対応ができていません。しかし冗長的な表現となっていますが、出現頻度が2回以下であれば、2回目に出現する位置でのKWIC表記は対応しています。出現頻度が多いキーワードは、別な工夫が必要となるので、先ずは文章内でのキーワードの出現頻度を求めます。

Excelでは、指定した文字をカウントしてくれるような関数が提供されていないので、文字列の出現頻度を求めるには工夫が必要です。そのため対象文章からカウントしたい文字列を削除して、その差分をカウントしたい文字列の長さで除算して求めます。

=(元の文章の長さ-元の文章から文字列を削除した長さ)/文字列の長さ

A B C
1 アオリイカ、コウイカ、カミナリイカ、ジンドウイカ、ミミイカ
2
3

上記で"イカ"が何回出現するかをカウントするためには、

1)文章の長さを求める
=len(A1)
結果:29

2)カウントしたい文字列を削除した文章を作成する
=substitute(A1,"イカ","")
結果:アオリ、コウ、カミナリ、ジンドウ、ミミ

3)カウントしたい文字列を削除した文章の長さ
=len(substitute(A1,"イカ",""))
結果:19

4)元の文章と文字列を削除した文章の差
=len(A1)-len(substitute(A1,"イカ",""))
結果:29-10=10

5)カウントしたい文字列の長さ
=len("イカ")
結果:2

6)出現頻度を求める
=(len(A1)-len(substitute(A1,"イカ","")))/len("イカ")
結果:(29-19)/2=5

これで"イカ"の出現頻度5回を求めることができます。

余談となりますが、この方法を用いると例文のように区切り文字で文字列が連続している場合に何個の文字列があるかも求めることができます。

=(len(A1)-len(substitute(A1,"、","")))+1

区切り文字"、"の個数+1が文字列の個数になるというわけです。

Excel KWICのA6のセルは、
=(len(G6)-len(substitute(G6,$B$1,"")))/len($B$1)
と記載します。

と、いうことで今回はここまで。
続きは次回以降に書きます。






2009年4月19日

TTM: TinyTextMiner でテキストマイニング

Tiny TextMinerとは、大阪大学大学院経済学研究科 松村研究所の松村真宏氏が公開しているフリーのテキストマイニングツールです。形態素解析にMeCabを利用して、単語の出現頻度と出現件数(単語を含むサンプル件数)を出力します。また係り受け解析のCaboChaと連携して係り受けによる、出現頻度と出現件数を出力することもできます。

Tiny TextMinerでテキストマイニング(その2)もご覧ください

csv形式のタグ付きテキストデータを読み込んで下記の6種類の出力結果が得られます。

  1. 語のタグ別出現度数(出現頻度)
  2. 語のタグ別出現度数(出現件数)
  3. 語×タグのクロス集計(出現頻度)
  4. 語×タグのクロス集計(出現件数)
  5. 語×語のクロス集計(出現件数)
  6. テキスト×語のクロス集計(出現頻度)

Tiny TextMinerのインストール

Tiny TextMinerのインストールを参照して下さい。ttm.exe(Tiny TextMiner本体)以外にMeCabとCaboChaをインストールします。CaboChaを利用するためには、Chasen(茶筌)のインストールも必要です。

*ダウンロード先のURL(バージョン)を更新(2020.5.25)

ソフト ダウンロード先 補足
 Tiny TextMiner   https://mtmr.jp/ttm/  Tiny TextMiner本体
 Mecab  https://taku910.github.io/mecab/  形態素解析
 文字コードは「Shift-JIS」を選択 
 CaboCha  https://taku910.github.io/cabocha/  係り受け解析
 Chasen  https://chasen-legacy.osdn.jp/  CaboChaで利用

Tiny TextMinerを使ってみよう

解析をする入力ファイルファイルは、下記の項目をCSV形式(カンマ区切り)で作成します。

1列目 タグ, 2列目 本文

1行目は、指定した項目毎にカウントするために必要な項目ですが、必須項目です。「茶筌でテキストマイニング(実践編) 」の例としてあげたメルマガ単位の集計をするような場合であれば、タグに曜日や月などを指定すると曜日毎の出現頻度などを計測することができます。

利用するサンプルは、上記の「茶筌でテキストマイニング(実践編) 」で利用した日経ビジネスオンラインのメルマガタイトルを利用します。(今回は件数が少ないのでタグは必要ありませんが、必須項目なので"1"を指定します。)

入力ファイルの例; 日経ビジネスオンライン.csv

1,米国で成功しなかったビジネスモデルに挑戦
1,企業トップの読者が選んだ、リーマンショック後の10大ニュース
1,やっぱりおかしいビッグスリー救済
1,新コラム、衆院選「候補者A」かく闘わんとす
1,カルロス・ゴーンがGMを救う

キーワードファイル、同義語ファイル、不要語ファイルは、指定しない。


Tiny TextMinerの実行画面

入力ファイルに「日経ビジネスオンライン.csv」を指定

キーワードファイル、同義語ファイル、不要語ファイルは、指定しない。


Tiny TextMinerの実行結果

下図は、出現頻度の集計結果(日経ビジネスオンライン_ttm1.csv)を加工したものです。辞書ファイルを何も適用していないのでので、「茶筌でテキストマイニング(実践編) 」の結果と異なっています。

大きな違いは、未知語が集計されていないので、「オバマ」という単語が欠落しているのと、米国の記載方法が、アメリカ、米、米国に分散されていることです。

未知語については、集計結果からは、探しだすことはできませんので、入力ファイルをみて辞書登録をする必要があります。


Tiny TextMinerで辞書の設定

MeCabに辞書登録をしても構いませんが、chasen(茶筌)と同様に毎回コンパイルが必要となります。Tiny TextMinerでは、キーワードの登録、同義語の登録、不要語の登録ができますので、こちらを活用します。


キーワードの登録

人名をキーワードファイルに登録します。1行毎に記載するだけです。

キーワード.txt

オバマ
ゴーン
三木谷
楽天

同義語の登録

米国、米、アメリカをすべて米国とします。先頭に集約する単語、半角スペースで区切って集約される単語を記載します。

同義語.txt

米国 アメリカ 米

不要語の登録

解析に不要な単語を1行に1単語指定します。

不要語.txt

人
何
力
場
ない

以上で、辞書ファイルの設定は終了です。Tiny TextMinerの実行画面で上記で作成したファイルを指定します。

実行結果(日経ビジネスオンライン_ttm1.csvを加工)

同義語で指定した「米国」が9回でトップ、キーワードで指定した「オバマ」が7回で次点にあがってきます。


Tiny TextMinerで係り受け分析

日本語における係り受け分析の難しさを理解した上で、係り受け分析を利用する必要があると思います。またTiny TextMinerでは、キーワードファイルに指定した単語は係り受け分析の対象にはなりません。

係り受け解析の実行は、「詳細設定」「その他」にある「係り受け解析を行う」をチェックするだけです。

下記は、係り受け解析の結果から「米国」を含むものだけを抽出した結果になります。

タグ 係り受け 品詞 品詞細分類 出現頻度
 1  大統領+米国  名刺+同義語   一般+同義語  1
 1  米国+成功  同義語+名詞  同義語+サ変接続  1
 1  緊急特集+米国自動車発経済危機章   名詞+同義語  形容動詞語幹+同義語   1
 1  米国主導時代+幕開け  同義語+名詞  同義語+一般  1
 1  米国+利下げ  同義語+名詞  同義語+サ変接続  1
 1  更新+米国自動車発経済危機章  名詞+同義語  サ変接続+同義語  1

「オバマ」については、キーワードに指定しているため係り受け分析ができないので、語×語のクロス集計(出現件数)から下記を作成しました。

同時出現単語 出現件数
 オバマ 7
 米国 2 
 記事 1
 サブ|プライム 1
 コラム 1
 特集 1
 ネット|市民 1
 中国|網|民 1
 ハト|派 1
 スタント|先生|直伝  1
 国民 1
 貧民|街 1
 大統領 1
 現象 1
 シカゴ 1

語×語のクロス表が作成できるので、統計解析ツールなどで深掘りすることも可能ですね。

Tiny TextMinerについては、4月24日に誠信書房から発売される「人文・社会科学のためのテキストマイニング」に使い方の詳細が掲載されるようです。

第1章 序
1.1 テキストマイニングがもたらすブレイクスルー
1.2 タダで本格的なテキストマイニング
1.3 本書の構成

第2章 TTMと関連ソフトウェアのインストール
2.1 テキストマイニングの準備
2.2 TTMのダウンロードとインストール
2.3 TTM関連のツールの準備
2.4 分析用各種ソフトウェアのインストール

第3章 TTMによるテキストデータの分析
3.1 TTMの基本的な使い方
3.2 テキストマイニングで知る経済情勢の時系列変化
3.3 質問紙調査の自由記述回答文の分析

第4章 Rを併用したテキストデータの統計解析
4.1 Rの使い方
4.2 Rによるテキストデータの解析
4.3 補遺・Rに関する参考書

第5章 Wekaを併用したテキストデータのデータマイニング
5.1 属性と事例
5.2 データマイニングのプロセス
5.3 入力ファイルの作成
5.4 入力ファイルの読み込み
5.5 決定木
5.6 ナイーブベイズ分類器
5.7 クラスタリング
5.8 まとめ

第6章 テキストマイニングの応用事例
6.1 質問紙調査の自由記述回答文
6.2 電子掲示板
6.3 ブログ
6.4 メーリングリストと議事録

第7章 テキストマイニングの基盤技術
7.1 自然言語処理
7.2 統計解析
7.3 データマイニング

関連するブログ(茶筌でテキストマイニング);

2009年2月1日

茶筅でテキストマイニング(実践編)

茶筌でテキストマイニング(辞書の登録)茶筌でテキストマイニング(連結品詞)と茶筌(Chasen)の設定方法について記載してきましたが、今回は、実践編としてテキストマイニングの基本となる単語の出現頻度をWinChaを利用して調べてみます。

WinChaでメルマガのタイトルを調べる

茶筌(Chasen)を使って自社や競合他社のメルマガのタイトルにどのような言葉が多く使われているかを調べてみましょう。サンプルで使用したのは、日経ビジネスオンラインの10月~12月の3ヶ月の間に発行されたメルマガのタイトルになります。Excelでメールタイトルと関連する変数の表を作成します。

例):

メールタイトル 曜日
米国で成功しなかったビジネスモデルに挑戦 12月 Fri
企業トップの読者が選んだ、リーマンショック後の10大ニュース 12月 Thu
やっぱりおかしいビッグスリー救済 12月 Thu
新コラム、衆院選「候補者A」かく闘わんとす 12月 Wed
カルロス・ゴーンがGMを救う 12月 Mon
【独占】楽天・三木谷社長が語るTBS株の行方 12月 Fri
今、学校と生徒のために時間を使いたいと思います 12月 Thu
日本一視察が多いスーパー、ハローデイの“感動経営” 12月 Wed
地域医療を“貸しはがし”から救った草の根の力 12月 Tue
激震・どうなる米ビッグスリー 12月 Mon

自社のメルマガであれば、これに開封率やクリック率などを追加してもいいかもしれません。


全角変換

茶筅(Chasen)で利用するのは、メルマガのタイトル行だけです。また正しく形態素解析をするために数字、英字を全角に変換しましょう。全角に変換しないと、解析結果が異なります。

下記は、「カルロス・ゴーンがGMを救う」をWinChaで形態素解析した例です。

GMが半角の場合は、未知語として扱われます。

同じ、「カルロス・ゴーンがGMを救う」のGMを全角にすると、名詞-固有名詞-組織となります。全角に変換するには、Excel関数の=jis()を利用すると簡単に変換できます。

また、「カルロス・ゴーン」が「カルロス」、「・」、「ゴー」、「ン」に分解されています。「ゴーン」が人名と解析されるように辞書登録をします。MyDic.dicに

(品詞 (名詞 固有名詞 人名 姓)) ((見出し語 (ゴーン 3000)) (読み ゴーン))

を追加します。

※辞書の登録方法については、茶筌でテキストマイニング(辞書登録)を参照して下さい。

辞書の登録結果が反映されて、「ゴーン」が名詞-固有名詞-人名-姓となりました。


WinChaでメールタイトルを解析する

Excelで全角に変換したメールタイトルをWinChaに貼り付けて全文解析を行います。実行結果を「編集」→「解析結果をコピー」してExcelに貼り付けます。

 

解析に必要な品詞

解析に必要な品詞は意見が分かれるところでもありますが、下記を参考にしてみて下さい。

解析に必要な品詞
名詞 名詞
一般
固有名詞
サ変接続
形容動詞語幹
ナイ形容詞語幹
非自立
副詞可能
代名詞
形容詞 自立
接尾
非自立
動詞 自立
非自立
副詞 一般
助詞類接続
未知語
○・・・重要 △・・・微妙

上記の品詞をExcelのフィルタ機能を利用して絞り込みをします。後はピボットで集計するだけです。


解析結果(ヒストグラム)

解析結果の基本形を上記品詞で絞り込んだ結果、出現頻度が3回以上の語彙の基本系でヒストグラムを描いたものが以下になります。3ヶ月間で日経ビジネスオンラインでは何を多くとりあげていたかが分かると思います。


同義語について

残念ながら茶筌(Chasen)には、同義語の定義ができません。上記の結果をみると、「米」「米国」がそれぞれ4件あります。またグラフにはありませんが、それ以外にも「アメリカ」が1件あります。これらを同義語と扱う場合には、自動的には処理できませんので、集計結果の編集が必要となります。以下は「アメリカ」に集約した結果となります。

日経ビジネスオンラインのメルマガでは、この3ヶ月間で米国に関しての記事が多く、特にオバマに関して多く取り上げていることがわかります。次に多いのが中国に関連する内容のようです。日本の経済を語るにはやはり、米国と中国がキーワードになるようです。それ以外にも「危機」「ビックスリー」「金融」「市場」と最近の話題がわかります。


茶筌(Chasen)による単語の出現頻度の発展系

例には示しませんが、曜日によるキーワードの差異、同一後の時系列変化、開封率の高いキーワードなど、単語の出現頻度をみるだけでも色々なことを調べることができるのではないでしょうか。今までテキストマイニングを未経験の方も是非ビジネスに活用してみてはいかがでしょうか。

茶筌(Chasen)とExcelで簡単にできるテキストマイニングについての関連書籍があります。Excelで学ぶテキストマイニング入門事例で学ぶテキストマイニングなどは、テキストマイニングの初級編としては良書だと思います。

関連するブログ(茶筌でテキストマイニング);

2009年1月24日

茶筌でテキストマイニング(連結品詞)

品詞を結合して一語と見なす

茶筌でテキストマイニング(辞書の登録)で茶筌(Chasen)の辞書登録方法を説明しましたが、サンプルとして辞書登録した「テキストマイニング」は、辞書に登録をしなければ、下記の解析結果のように、「名詞-一般」と「名詞-サ変接続」に分解されます。同様に「統計解析」については、「名詞-サ変接続」と「名詞-サ変接続」に分解されます。

WinChaでの実行結果(連結品詞登録前)

未知語でない場合は、辞書登録以外にも連結品詞という方法で一語と判断させる方法があります。実際に試してみましょう。


chasenrcの変更

c:\Program Files\chasen21\dic\chasenrc をメモ帳やテキストエディターで開いて

;(連結品詞 ((名詞 数))
;((記号 アルファベット)))

の下に

(連結品詞 ((名詞 一般) (名詞 一般)(名詞 サ変接続)))

と追記して保存します。

上記は、「名詞-一般」若しくは「名詞-サ変接続」が連続する場合には、「名詞-一般」とするという意味になります。chasenrcを保存してWinChaを実行してみましょう。


WinChaでの実行結果(連結品詞登録後)


「データマイニング」「統計解析」何れも名詞一般として、一語として判断されました。

この連結品詞を使えば、

① 「2009年」を一語(名詞)として解析
(連結品詞 ((名詞) (名詞 数)(名詞 接尾 助数詞)))

「10大ニュース」を一語(名詞)として解析
(連結品詞 ((名詞) (名詞 数)(接頭詞 名詞接続)(名詞 一般)))

③名詞が連続する場合には、すべて「名詞」とするのであれば、下記のように記載することも可能です。
(連結品詞 ((名詞)))

④連続する記号を一語として解析
(連結品詞 ((記号 一般)))

など、色々設定できるので試してみてください。

※数字は全角数字の場合のみ日本語として解析対象になります。(半角数字は未知語)

一時的に設定を未反映とするならば行頭にセミコロン(;)を付加してください。

;(連結品詞 ((名詞))

茶筌(Chasen)で辞書登録と連結品詞が使いこなせれば解析も随分と捗ります。

関連するブログ(茶筌でテキストマイニング);

2009年1月18日

茶筌でテキストマイニング(辞書の登録)

最近では、アンケート調査結果の自由回答文をテキストマイニングツールを用いてテキストマイニングを実施するのが当たり前となっていますが、一番最初は、茶筌(Chasen)を使って単語の出現頻度を調べていました。設問を工夫すれば茶筌だけでもかなりの発見があります。

【設問】雑誌に掲載して欲しい記事は?

この場合であれば、名詞句を中心にカウントするだけでも発見はあります。

【設問】新製品の○○について味をひとことで表現すると?

この場合は、名詞句、形容詞句でしょうか。

ここでは、当時お世話になった茶筌についての利用方法について掲載しておきます。


茶筌 version 2.1 for Windows のインストール

茶筌(Chasen)とは、奈良先端科学技術大学院大学松本研究室で開発された形態素解析のツールです。Windows版も提供されています。こちらから「cha21244sp5.exe」がダウンロードできます。


茶筌の実行

WinCha 2000を起動して「テキストマイニングとマインドマップについて考える」と文章を入力して実行した結果が下記になります。(チェックは、表層語と品詞です。)

辞書登録前の実行結果

「データマイニング」は、「データ」と「マイニング」にマインドマップは、「マインド」と「マップ」に分解されています。これは、茶筌(Chasen)の辞書には、「データマイニング」や「マインドマップ」が一語として登録されていないからです。またGoogleやYahooなどは、未知語となります。

このままでは、品詞ごとに単語の出現頻度をカウントするのにもちょっと不便です。

茶筌(Chasen)の辞書登録

そこで、自分で辞書を作成して登録必要があります。辞書登録はコマンドベースのツールしか提供されていませんので、以下の手順で実施してください。


辞書ファイルのダウンロード

茶筌(Chasen)は辞書としてIPA品詞体系を利用していますので、IPADICをダウンロードします。気をつけなければならないのは、IPADICのバージョンです。最新版の辞書もリリースされていますが、WinChaで辞書作成では、こちら からipadic-sjis-2.5.0.zipをダウンロードしてください。


辞書ファイルの展開

c:\Program Files\chasen21 の下にMyDicフォルダを作成します。MyDicにipadic-sjis-2.5.0から下記の4ファイルをコピーして下さい。

connect.cha(連接表ファイル)
grammar.cha(品詞定義ファイル)
ctypes.cha(活用型定義ファイル)
cforms.cha(活用形定義ファイル)

次にipadic-sjis-2.5.0の中にある,Makefile.bat をc:\Program Files\chasen21 にコピーします。


辞書作成実行ファイルの変更

Makefile.batをメモ帳などで開いて、MyDicフォルダで処理をして、作成辞書名をMyDicにするように下記のように内容を変更します。

8行目
変更前:cd dic
変更後:cd MyDic

33行目
変更前:..\mkchadic\sortdic chadic.txt chadic.int
変更後:..\mkchadic\sortdic chadic.txt MyDic.int

40行目
変更前:..\mkchadic\pattool -F chadic
変更後:..\mkchadic\pattool -F MyDic 

辞書登録

MyDicフォルダの下にMyDic.dicというファイルを作成します。ここに下記の辞書内容を定義します。

c:\Program Files\chasen21\MyDic\MyDic.dic
(品詞 (名詞 一般)) ((見出し語 (データマイニング 5000)) (読み データマイニング)) (品詞 (名詞 固有名詞 一般)) ((見出し語 (マインドマップ 5000)) (読み マインドマップ))

辞書作成

Windowsのスタートメニューにある「ファイル名を指定して実行」でcmdと入力して、コマンドプロンプトを立ち上げます。

プロントでcd c:\Program Files\chasen21 と入力してEnterキーを押してください。C:\Program Files\chasen21と表示されますので、続いてmakefileと入力してEnterキーを押すと辞書ファイルの作成が始まります。

下記のように最後にchasen dictionary copiled successfully.と表示されると辞書ファイルの作成は終了です。exitと入力してコマンドプロンプトを終了させます。


再生した辞書ファイルの登録

MyDicフォルダを参照すると下記の4ファイルが作成されています。

MyDic.in
MyDic.pat
matrix.cha
table.cha

この中のMyDic.intとMyDic.patをc:\Program Files\chasen21\dicにコピーします。


MakeFile.bat に上記2ファイルをコピーする記述(赤字部分)を追加すると便利です。

@echo pattool...
..\mkchadic\pattool -F MyDic
if errorlevel 1 goto ERROREXIT

@echo copy jisho-files...
copy /y mydic.pat ..\dic\
copy /y mydic.int ..\dic\

cd ..


環境設定ファイルの変更

茶筌が新たに作成した辞書を参照できるようにc:\Program Files\chasen21\dicにあるchasenrcの内容を変更します。

2行目
変更前:(PATDIC        chadic)
変更後:(PATDIC        chadic MyDic)

これで新しく作成したMyDic辞書も参照されるようになります。WinCha 2000を起動して先程と同様に

「テキストマイニングとマインドマップについて考える」と文章を入力して実行します。

今度は、データマイニングもマインドマップも登録した辞書に従い、一語として認識されます。

辞書登録後の実行結果

関連するブログ(茶筌でテキストマイニング);

関連するブログ(茶筌でテキストマイニング);