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)
勤務先の社内自然言語処理勉強会での発
表資料です.自然言語処理の基本を説明
します.

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

なお,上のコードのうち,([ぁ-んー]+|[ァ-ンー]+|[\\u4e00-\\u9FFF]+|[ぁ-んァ-ンー\\u4e00-\\u9FFF]+)(\n)([ぁ-んー]+|[ァ-ンー]+|[\\u4e00-\\u9FFF]+|[ぁ-んァ-ンー\\u4e00-\\u9FFF]+) の部分で「日本語文字列(連続)+改行+日本語文字列(連続)」という並びにマッチします.ここで,「日本語文字列」として扱っているのは,ひらがなカタカナ長音符「ー」漢字 (U+4E00〜U+9FFF) です.

さらに,最初の ([ぁ-んー]+|[ァ-ンー]+|[\\u4e00-\\u9FFF]+|[ぁ-んァ-ンー\\u4e00-\\u9FFF]+)グループ1で,日本語文字の連続にマッチします.+ は「1文字以上の繰り返し」,| は「いずれかに一致」し,その中にある4つのパターンはいずれも日本語文字の連続を表します.ここで,[ぁ-んー]はひらがな+長音符,[ァ-ンー]はカタカナ+長音符,[\\u4e00-\\u9FFF] はCJK統合漢字 (CJK Unified Ideographs) のブロックに該当し,漢字(日本語,中国語,韓国語で共通に使われる漢字)を意味します.さらに,[ぁ-んァ-ンー\\u4e00-\\u9FFF] はひらがな,カタカナ,長音符,漢字の混在連続を意味します.実際のマッチでは,この4つのどれかに一致すればOKです.

次の (\n)グループ2で,改行文字にちょうど1文字一致します.さらに,その後に続く ([ぁ-んー]+|[ァ-ンー]+|[\\u4e00-\\u9FFF]+|[ぁ-んァ-ンー\\u4e00-\\u9FFF]+)グループ3で,これは先頭のグループ1と同じ定義であり,改行の直後の日本語文字列の連続に一致します.

また,14-15行目の r'\1\3'text については,text について上のルールでマッチした場合に,\1 で表現されるグループ1と \3 で表現されるグループ3に置き換えることを意味しています.つまり,グループ2である改行文字を含めないために,結果的に日本語に挟まれた改行だけを削除することになります.

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

改行を削除する
# ファイルを開く
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

目次に戻る