Python入門トップページ


目次

  1. 準備
  2. MeCab の第一歩
  3. 簡単な形態素解析
  4. TF-IDF を計算してみよう
  5. ワードクラウドを作成してみよう

Python で自然言語処理をしてみよう - MeCab 編

簡単な形態素解析

ここでは,テキストファイルを開いて簡単な形態素解析を実行してみよう.まず,GitHub のリポジトリから corpora.zip をダウンロードし,展開したフォルダを Jupyter Notebook のファイルと同じフォルダ内に展開します.つまり,*.ipynb や *.py と同じ階層に corpora フォルダがあり,その中に sample_1.txt や sample_4.txt などが存在するようにしてください.なお,これらのテキストファイルは文字コードに UTF-8 を,改行コードには LF を使っています.

まずはファイル「sample_4.txt」を開いて形態素解析を実行してみよう.なお,下のコードの12行目にある os.path.sep.join() は,OS の種類によってフォルダの区切り文字が異なることに対応するための記述です.詳細はここを参照してください

ファイルを開いて形態素解析を実行
# モジュールのインポート
import MeCab as mc
import os

def my_Mecab(text):
    t = mc.Tagger()  # for Windows
    # t = mc.Tagger('-r /dev/null -d /opt/homebrew/lib/mecab/dic/ipadic')  # for macOS
    # t = mc.Tagger('-r /dev/null -d /opt/homebrew/lib/mecab/dic/mecab-ipadic-neologd')
    print(t.parse(text))

# ファイルを開く
f = open(os.path.sep.join(['corpora', 'sample_4.txt']), encoding='utf-8')
raw = f.read()

# ファイルの中身をそのまま表示する
print(raw)
# 形態素解析を実行する
my_Mecab(raw)
自然言語処理の基本を説明します.

自然	名詞,形容動詞語幹,*,*,*,*,自然,シゼン,シゼン
言語	名詞,一般,*,*,*,*,言語,ゲンゴ,ゲンゴ
処理	名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
基本	名詞,一般,*,*,*,*,基本,キホン,キホン
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
説明	名詞,サ変接続,*,*,*,*,説明,セツメイ,セツメイ
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
.	記号,句点,*,*,*,*,.,.,.
EOS

次はファイル「sample_1.txt」を開いて形態素解析を実行してみよう.このファイルは文章中に改行文字が含まれています.特に「発表」という単語の中間で改行文字が存在するために,「発」と「表」に分割されてしまっています.

ファイルを開いて形態素解析を実行
# ファイルを開く
f = open(os.path.sep.join(['corpora', 'sample_1.txt']), encoding='utf-8')
raw = f.read()
f.close()

# ファイルの中身をそのまま表示する
print(raw)
# 形態素解析を実行する
my_Mecab(raw)
勤務先の社内自然言語処理勉強会での発
表資料です.自然言語処理の基本を説明
します.

勤務	名詞,サ変接続,*,*,*,*,勤務,キンム,キンム
先	名詞,接尾,一般,*,*,*,先,サキ,サキ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
社内	名詞,一般,*,*,*,*,社内,シャナイ,シャナイ
自然	名詞,形容動詞語幹,*,*,*,*,自然,シゼン,シゼン
言語	名詞,一般,*,*,*,*,言語,ゲンゴ,ゲンゴ
処理	名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ
勉強	名詞,サ変接続,*,*,*,*,勉強,ベンキョウ,ベンキョー
会	名詞,接尾,一般,*,*,*,会,カイ,カイ
で	助詞,格助詞,一般,*,*,*,で,デ,デ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
発	名詞,一般,*,*,*,*,発,ハツ,ハツ
表	名詞,接尾,一般,*,*,*,表,ヒョウ,ヒョー
資料	名詞,一般,*,*,*,*,資料,シリョウ,シリョー
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
.	記号,句点,*,*,*,*,.,.,.
自然	名詞,形容動詞語幹,*,*,*,*,自然,シゼン,シゼン
言語	名詞,一般,*,*,*,*,言語,ゲンゴ,ゲンゴ
処理	名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
基本	名詞,一般,*,*,*,*,基本,キホン,キホン
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
説明	名詞,サ変接続,*,*,*,*,説明,セツメイ,セツメイ
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
.	記号,句点,*,*,*,*,.,.,.
EOS

したがって,文の途中に改行文字が含まれるような場合には改行を削除する処理が必要になりそうです.ただし,英語の文書でそのまま改行を削除すると単語が連結されてしまう恐れがあるので,改行文字の前後が全角文字の場合は改行文字を削除し,それ以外はスペースに置き換えるような処理が必要です.

次のコードでは strip_CRLF_from_Text( ) 関数を定義しています.この関数では,改行文字やタブ文字の前後が日本語文字の場合のみその文字を削除し,それ以外の場合は半角スペースに置換しています.

改行を削除する
# モジュールのインポート
import MeCab as mc
import os
import re

def strip_CRLF_from_Text(text):
    """
    テキストファイルの改行,タブを削除する.
    改行文字やタブ文字の前後が日本語文字の場合はそれを削除する.
    それ以外はスペースに置換する.
    """
    # 改行文字(タブ文字)前後の文字が日本語文字の場合は改行を削除する
    plaintext = re.sub('([ぁ-んー]+|[ァ-ンー]+|[\\u4e00-\\u9FFF]+|[ぁ-んァ-ンー\\u4e00-\\u9FFF]+)(\n)([ぁ-んー]+|[ァ-ンー]+|[\\u4e00-\\u9FFF]+|[ぁ-んァ-ンー\\u4e00-\\u9FFF]+)',
                       r'\1\3',
                       text)
    # 残った改行とタブ記号はスペースに置換する
    plaintext = plaintext.replace('\n', ' ').replace('\t', ' ')
    return plaintext

# ファイルを開く
f = open(os.path.sep.join(['corpora', 'sample_1.txt']), encoding='utf-8')
raw = f.read()
f.close()

# ファイルの中身をそのまま表示する
print(raw)
# 改行を削除して表示する
text = strip_CRLF_from_Text(raw)
print(text)
勤務先の社内自然言語処理勉強会での発
表資料です.自然言語処理の基本を説明
します.

  勤務先の社内自然言語処理勉強会での発表資料です.自然言語処理の基本を説明します.

英語の文章でも正しく動作する(つまり,改行は削除されてもスペースは削除されない)ことを確認しておく.

改行を削除する
# ファイルを開く
f = open(os.path.sep.join(['corpora', 'en_abs_1.txt']), encoding='utf-8')
raw = f.read()
f.close()

# ファイルの中身をそのまま表示する
print(raw)
# 改行を削除して表示する
text = strip_CRLF_from_Text(raw)
print(text)
In this paper, we consider a nonparametric adaptive
software rejuvenation schedule under a random censored data.
For u failure time data and v random censored data, we
formulate upper and lower bounds of the predictive system
availability based on a nonparametric predictive inference (NPI).
Then, we derive adaptive rejuvenation policies which maximizes
the upper or lower bound. In simulation experiments, we show
that estimates of the software rejuvenation schedule are updated
by acquisition of new failure data, and converge to the theoretical
optimal solution.

In this paper, we consider a nonparametric adaptive software rejuvenation schedule under a random censored data. For u failure time data and v random censored data, we formulate upper and lower bounds of the predictive system availability based on a nonparametric predictive inference (NPI). Then, we derive adaptive rejuvenation policies which maximizes the upper or lower bound. In simulation experiments, we show that estimates of the software rejuvenation schedule are updated by acquisition of new failure data, and converge to the theoretical optimal solution.

改行文字の削除ができたので,ファイル「sample_1.txt」をもう一度分かち書きしてみよう.今度は改行を含んだ「発 表」が「発表」として認識されたことがわかります.

改行文字を削除した後に分かち書き
# モジュールのインポート
import MeCab as mc
import os
import re

def my_Mecab(text):
    t = mc.Tagger()  # for Windows
    # t = mc.Tagger('-r /dev/null -d /opt/homebrew/lib/mecab/dic/ipadic')  # for macOS
    # t = mc.Tagger('-r /dev/null -d /opt/homebrew/lib/mecab/dic/mecab-ipadic-neologd')
    print(t.parse(text))

def strip_CRLF_from_Text(text):
    """
    テキストファイルの改行,タブを削除する.
    改行前後が日本語文字の場合は改行文字やタブ文字を削除する.
    それ以外はスペースに置換する.
    """
    # 改行前後の文字が日本語文字の場合は改行を削除する
    plaintext = re.sub('([ぁ-んー]+|[ァ-ンー]+|[\\u4e00-\\u9FFF]+|[ぁ-んァ-ンー\\u4e00-\\u9FFF]+)(\n)([ぁ-んー]+|[ァ-ンー]+|[\\u4e00-\\u9FFF]+|[ぁ-んァ-ンー\\u4e00-\\u9FFF]+)',
                       r'\1\3',
                       text)
    # 残った改行とタブ記号はスペースに置換する
    plaintext = plaintext.replace('\n', ' ').replace('\t', ' ')
    return plaintext

# ファイルを開く
f = open(os.path.sep.join(['corpora', 'sample_1.txt']), encoding='utf-8')
raw = f.read()
f.close()

# ファイルの中身をそのまま表示する
print(raw)
# 改行を削除して表示する
text = strip_CRLF_from_Text(raw)
print(text)
# 形態素解析を実行する
my_Mecab(text)
勤務先の社内自然言語処理勉強会での発
表資料です.自然言語処理の基本を説明
します.

  勤務先の社内自然言語処理勉強会での発表資料です.自然言語処理の基本を説明します.
勤務	名詞,サ変接続,*,*,*,*,勤務,キンム,キンム
先	名詞,接尾,一般,*,*,*,先,サキ,サキ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
社内	名詞,一般,*,*,*,*,社内,シャナイ,シャナイ
自然	名詞,形容動詞語幹,*,*,*,*,自然,シゼン,シゼン
言語	名詞,一般,*,*,*,*,言語,ゲンゴ,ゲンゴ
処理	名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ
勉強	名詞,サ変接続,*,*,*,*,勉強,ベンキョウ,ベンキョー
会	名詞,接尾,一般,*,*,*,会,カイ,カイ
で	助詞,格助詞,一般,*,*,*,で,デ,デ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
発表	名詞,サ変接続,*,*,*,*,発表,ハッピョウ,ハッピョー
資料	名詞,一般,*,*,*,*,資料,シリョウ,シリョー
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
.	記号,句点,*,*,*,*,.,.,.
自然	名詞,形容動詞語幹,*,*,*,*,自然,シゼン,シゼン
言語	名詞,一般,*,*,*,*,言語,ゲンゴ,ゲンゴ
処理	名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
基本	名詞,一般,*,*,*,*,基本,キホン,キホン
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
説明	名詞,サ変接続,*,*,*,*,説明,セツメイ,セツメイ
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
.	記号,句点,*,*,*,*,.,.,.
EOS

なお,上のソースコードは,macOS を利用する際に 8 行目で標準の IPA 辞書を用いて形態素解析が実行されます.8 行目をコメントアウトして,9 行目を有効にすることで高性能な mecab-ipadic-NEologd 辞書を用いた形態素解析が実行できます.この mecab-ipadic-NEologd 辞書を利用した結果は次のようになるはずです.IPA 辞書では認識できなかった「勤務先」,「自然言語処理」,「勉強会」がそれぞれ一つの単語として認識されています.

勤務先の社内自然言語処理勉強会での発
表資料です.自然言語処理の基本を説明
します.

  勤務先の社内自然言語処理勉強会での発表資料です.自然言語処理の基本を説明します.
勤務先	名詞,固有名詞,一般,*,*,*,勤務先,キンムサキ,キンムサキ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
社内	名詞,一般,*,*,*,*,社内,シャナイ,シャナイ
自然言語処理	名詞,固有名詞,一般,*,*,*,自然言語処理,シゼンゲンゴショリ,シゼンゲンゴショリ
勉強会	名詞,固有名詞,一般,*,*,*,勉強会,ベンキョウカイ,ベンキョーカイ
で	助詞,格助詞,一般,*,*,*,で,デ,デ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
発表	名詞,サ変接続,*,*,*,*,発表,ハッピョウ,ハッピョー
資料	名詞,一般,*,*,*,*,資料,シリョウ,シリョー
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
.	記号,句点,*,*,*,*,.,.,.
自然言語処理	名詞,固有名詞,一般,*,*,*,自然言語処理,シゼンゲンゴショリ,シゼンゲンゴショリ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
基本	名詞,一般,*,*,*,*,基本,キホン,キホン
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
説明	名詞,サ変接続,*,*,*,*,説明,セツメイ,セツメイ
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
.	記号,句点,*,*,*,*,.,.,.
EOS

目次に戻る