Pythonでjanomeを使って形態素解析する方法(テキスト文書の品詞を数えテキストファイルやcsvファイルに保存する)

今日はPythonの形態素解析エンジンであるjanomeを使って、テキスト文書の品詞を数えるプログラムを紹介します。

このページで分かること

1.janomeの簡単な説明
2.janomeのインストール方法
3.janomeで形態素解析する方法
4.品詞を数える方法
5.品詞とその数量をテキストとcsvファイルに保存する方法

janomeの簡単な説明

janomeとは日本語の形態素解析エンジンです。

特徴として、

  • インストールが容易
  • 辞書を内包している(正確にはmecabの辞書を使っているようです)

なお、ドキュメントの詳細はココが詳しいです。

形態素解析とは、文書を形態素(言語で意味を持つ最小単位)に分割し品詞等を判別する作業です。

品詞とは、「名詞」「動詞」「助詞」「助動詞」「句点」を指します。昔、学校で習ったやつです。

入力された文書を内包辞書と突き合わせて品詞に分解することができます。

janomeのインストール方法

プロンプト画面で以下のコマンドを入力してください。

> pip install janome  ⏎

janomeで形態素解析する方法

ソースコード

以下のソースコードを見てください。

import csv
from janome.tokenizer import Tokenizer

# テキストファイルを開く
txt = open("./janome/test_00.txt", "r", encoding='utf-8')

# テキストの内容をlinesに代入(linesはリスト)
lines = txt.readlines()

print("lines=", lines)

# Tokenizer()の初期化
t = Tokenizer()

word_dic = {}

for line in lines:
  # tokenize()メソッドにlistの文書を渡し、
  # 内包辞書を使用して日本語のテキストを解析する
    toklist = t.tokenize(line)
    for w in toklist:
        word = w.surface
        ps = w.part_of_speech
        if ps.find('名詞') < 0:
            continue
        if not word in word_dic:
            word_dic[word] = 0
        word_dic[word] += 1

keys = sorted(word_dic.items(), key = lambda x:x[1], reverse=True)

# 文字と数量を書き込むテキストファイルを準備
f_txt = open("./janome/output_1.txt", "w", encoding="cp932")

# 文字と数量を書き込むcsvファイルを準備
f_csv = open("./janome/output_2.csv", "w", newline='', encoding="cp932")

w = []
c = []

# テキストから抽出した文字(名詞)と数量の50個分をリスト化する
for word, cnt in keys[:50]:
  
    # 文字(名詞)と名詞の数量を確認
    print("{0} ({1}) ".format(word, cnt), end="")

    # カンマ区切りでテキストに書き込む
    f_txt.write("{0},{1}".format(word, cnt) + "\n")

    # 文字(名詞)と名詞の数量をwとcのリストに保存
    w.append(word)
    c.append(cnt)

# 開いているテキストファイル(f_txt)を閉じる
f_txt.close()

# wとcのリストの中身をzip()でセットにして再リスト化
tu = list(zip(w, c))

# csvファイルにtuの値を書き込む
csv.writer(f_csv).writerows(tu)

ソースコードの意味を順に説明します。

必要なパッケージのインポート

今回はテキスト文書を読み込んで、janomeで形態素解析を行い、品詞とその数をテキストファイルとcsvファイルに保存します。

このタスクを実行するために、はじめにcsvとjanome.tokenizer パッケージの Tokenizerをインポートします。

import csv
from janome.tokenizer import Tokenizer

テキストファイルを開く

次にテキストファイルを開きます。

txt = open("./janome/test_00.txt", "r", encoding='utf-8')

open( ) のカッコ内の第一引数はテキストファイルが置いてあるパスです。

第二引数の ” r ” はファイルを読み込みモードで開く指示です。

第三引数は日本語の文書を読み込む際に文字化けしないよう ' utf-8 ' を指定します。

テキスト文書によっては ' utf-8 ' でも文字化けする場合があります。

そのときは、’ shift_jis ' や ' cp932 ' を試してください。

テキスト文書をlinesに代入

テキスト文書を行毎に読み込んで lines に代入します。lines はリストです。

lines = txt.readlines()

形態素解析の準備

Tokenizer( ) を初期化しておきます。なお、Tokenizer オブジェクトの初期化はコストが高い(処理が重い)ので、for 文内には入れないようにしてください。

# Tokenizer()の初期化
t = Tokenizer()

内包辞書を使用して日本語のテキストを解析

以下のソースコード部分でテキスト文書の解析と品詞の数を数えます。

word_dic = {}

for line in lines:
  # tokenize()メソッドにlistの文書を渡し、
  # 内包辞書を使用して日本語のテキストを解析する
    toklist = t.tokenize(line)
    for w in toklist:
        word = w.surface
        ps = w.part_of_speech
        if ps.find('名詞') < 0:
            continue
        if not word in word_dic:
            word_dic[word] = 0
        word_dic[word] += 1

keys = sorted(word_dic.items(), key = lambda x:x[1], reverse=True)

はじめに、word_dic = { } で空のディクショナリを用意しておきます。

次に、先ほどリスト化しておいた lines から一行づつ文書を取り出して、t.tokenize ( line ) で形態素解析します。これを for 文で繰り返します。

w.surface の部分では、形態素解析された品詞(言葉)が抽出され、word に代入されます。

例えば、名詞なら「太陽」とか「作者」などで、句点なら「。」、助動詞なら「ある」、助詞なら「が」などです。

その次の w.part_of_speech では、品詞の種類が抽出されます。

例えば、word で「ある」が抽出されたときは、ps = 助動詞, *, *, * のようになります。細分類が定義されていないと「 * 」となります。

その次の if 文で ps.find( ' 名詞 ' ) < 0 としており、今回は名詞の数を数えるプログラムとしています。

もし ' 名詞 ' が 抽出されなければ continue文によりブロックの先頭(for文の先頭)に戻るようにしています。

今の場合は、for w in toklist : に戻ります。

その次の if 文でその抽出された word が word_dic のディクショナリにあるかないか確認し、なければ 0 カウント、あれば 1 カウントします。

word_dic のディクショナリの中身について説明しておきます。

for 文( for line in lines: )を繰り返すと、word_dic には以下のように名詞と数量が記載されます。

(例)word_dic = { ' 文学 ' : 23 , ' 定義 ' : 2 , ' 概念 ' : 6 }

また、その次の keys = sorted( ) で名詞を数量の多いものから順に並べ替えています。

(例)keys = [ ( ' 文学 ' , 23 ) , ( ' 概念 ' , 6 ) , ( ' 定義 ' , 2 ) ]

並べ変えを行うことで、テキスト文書に含まれる頻出名詞を特定し易くなります。

つまり、テキスト文書が何について書かれたものか推測し易くなります。

解析結果の保存

形態素解析した結果を、テキストファイルとcsvファイルに保存します。

まずは以下のソースコード部分で書き込むファイルを準備します。

# 文字と数量を書き込むテキストファイルを準備
f_txt = open("./janome/output_1.txt", "w", encoding="cp932")

# 文字と数量を書き込むcsvファイルを準備
f_csv = open("./janome/output_2.csv", "w", newline='', encoding="cp932")

第一引数はファイルの保存場所のパスです。

第二引数に " w " と記載することで書き込みモードで開くことを指定しています。

次に、以下のソースコード部分で書き込みを行います。

なお今回は名詞の数50個分を記載することとします。

w = []
c = []

# テキストから抽出した文字(名詞)と数量の50個分をリスト化する
for word, cnt in keys[:50]:
  
    # 文字(名詞)と名詞の数量を確認
    print("{0} ({1}) ".format(word, cnt), end="")

    # カンマ区切りでテキストに書き込む
    f_txt.write("{0},{1}".format(word, cnt) + "\n")

    # 文字(名詞)と名詞の数量をwとcのリストに保存
    w.append(word)
    c.append(cnt)

# 開いているテキストファイル(f_txt)を閉じる
f_txt.close()

# wとcのリストの中身をzip()でセットにして再リスト化
tu = list(zip(w, c))

# csvファイルにtuの値を書き込む
csv.writer(f_csv).writerows(tu)

プログラムを実行すると、以下のファイルが指定フォルダに保存されます。

output_1.txt

output_2.csv

まとめ

  • janomeを使うと日本語文書の形態素解析が簡単にできる
  • 形態素解析により調べたい品詞を数えることができる
  • 品詞数を調べることで、その文書が何について書かれたものか推測し易くなる
  • 形態素解析結果をテキストファイルやcsvファイルに保存できる