Python入門トップページ


目次

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

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

簡単な形態素解析

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

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

ファイルを開いて形態素解析を実行# モジュールのインポート
from janome.tokenizer import Tokenizer
import os

def my_Janome(text):
    t = Tokenizer()
    results = t.tokenize(text)
    for token in results:
        print(token)

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

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

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

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

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

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

勤務	名詞,サ変接続,*,*,*,*,勤務,キンム,キンム
先	名詞,接尾,一般,*,*,*,先,サキ,サキ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
社内	名詞,一般,*,*,*,*,社内,シャナイ,シャナイ
自然	名詞,形容動詞語幹,*,*,*,*,自然,シゼン,シゼン
言語	名詞,一般,*,*,*,*,言語,ゲンゴ,ゲンゴ
処理	名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ
勉強	名詞,サ変接続,*,*,*,*,勉強,ベンキョウ,ベンキョー
会	名詞,接尾,一般,*,*,*,会,カイ,カイ
で	助詞,格助詞,一般,*,*,*,で,デ,デ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
発	名詞,一般,*,*,*,*,発,ハツ,ハツ

	記号,空白,*,*,*,*,
,*,*
表	接頭詞,名詞接続,*,*,*,*,表,オモテ,オモテ
資料	名詞,一般,*,*,*,*,資料,シリョウ,シリョー
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
.	記号,句点,*,*,*,*,.,.,.
自然	名詞,形容動詞語幹,*,*,*,*,自然,シゼン,シゼン
言語	名詞,一般,*,*,*,*,言語,ゲンゴ,ゲンゴ
処理	名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
基本	名詞,一般,*,*,*,*,基本,キホン,キホン
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
説明	名詞,サ変接続,*,*,*,*,説明,セツメイ,セツメイ

	記号,空白,*,*,*,*,
,*,*
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
.	記号,句点,*,*,*,*,.,.,.
EOS

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

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

改行を削除する# モジュールのインポート
from janome.tokenizer import Tokenizer
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」をもう一度分かち書きしてみよう.今度は改行を含んだ「発 表」が「発表」として認識されたことがわかります.さらに改行時にあった不要な空白も削除されていることもわかります.

改行文字を削除した後に分かち書き# モジュールのインポート
from janome.tokenizer import Tokenizer
import os
import re

def my_Janome(text):
    t = Tokenizer()
    results = t.tokenize(text)
    for token in results:
        print(token)

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

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

目次に戻る