【NLP/実践】Janomeで単語分割しよう①【前処理

Janomeで単語分割

はじめに

今回から、機械学習の一つである自然言語処理(NLP:Natural Language Processing)の実装やっていきます。機械学習と聞くと、難しそうですが実際はとても簡単です。このページを通してそれを実感してもらえたら嬉しいです。

【今日のゴール】

まずは、前処理をできるようにしたいです。そのため、今日のゴールは「文章から動詞だけを抽出する」に設定します。また、今回はJanomeと呼ばれるpythonライブラリを使ってやっていきます。

NLP 自然言語処理

では、早速やっていきましょう!

仮想環境の作成

仮想環境

まずは仮想環境を作成していきましょう。このステップはお好みで判断してください。

python -m venv 仮想環境名 #仮想環境の作成

仮想環境名/Scripts/activate #仮想環境の有効化(Windows version)
source 仮想環境名/bin/activate #仮想環境の有効化(Mac/Linux version)

cd 仮想環境名/Scripts #Scriptsディレクトリまで移動

echo. > ファイル名.py #Pythonファイルを作成

code . #vsCodeを開く

pythonファイルを作成する場所はactivate.batやactivateと同じディレクトリにしましょう。

仮想環境には以下のメリットがあります。

  • プロジェクトごとの環境の分離
  • クリーンアップの容易化

ライブラリのインストール

EPS

今回はjanomeというpythonライブラリを使っていきます。

cd Scripts #Scriptsディレクトリに移動
pip install janome #janomeをインストール

【Janomeの特徴】

  • Pythonで書かれた自然言語処理(NLP)のライブラリです。
  • 主に日本語のテキスト処理に特化しています。
  • また、テキストを形態素(単語やそれに類する単位)に分割するためのツールです。

テキストデータを準備

テキストデータを準備

適当なテキストデータ(コーパス)がある方は適当にそれを使ってください。もし、無い人は以下に中二病前回なデータを載せておくので、それをコピペして使ってみてください。

『ファイル名.txt』というファイルをScripts直下につくり、文章をそこにコピペすれば準備完了です。

プログラミング

プログラミング

では、実際にプログラミングしていきましょう!

Python
from janome.tokenizer import Tokenizer

# テキストファイルのパス
file_path = 'テキストデータが入ったファイル名.txt'

# JanomeのTokenizerオブジェクトを作成
tokenizer = Tokenizer()

# テキストデータを読み込み、形態素解析を行う関数
def analyze_text(text):
    tokens = tokenizer.tokenize(text)
    for token in tokens:
        print(token)

# テキストファイルを読み込み、形態素解析を行う
with open(file_path, 'r', encoding='utf-8') as file:
    text_data = file.read()
    analyze_text(text_data)

準備ができたら、cmdで実行してみましょう。実行をするには「ファイル名.py」と入力するだけで実行できます。

結果はこんな感じになりました。(長かったので、省略しています。)

【      記号,括弧開,*,*,*,*,【,【,【
感傷    名詞,一般,*,*,*,*,感傷,カンショウ,カンショー
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
浸る    動詞,自立,*,*,五段・ラ行,基本形,浸る,ヒタル,ヒタル
の      名詞,非自立,一般,*,*,*,の,ノ,ノ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
楽      名詞,形容動詞語幹,*,*,*,*,楽,ラク,ラク
。      記号,句点,*,*,*,*,。,。,。
そんな  連体詞,*,*,*,*,*,そんな,ソンナ,ソンナ
こと    名詞,非自立,一般,*,*,*,こと,コト,コト
より    助詞,格助詞,一般,*,*,*,より,ヨリ,ヨリ
も      助詞,係助詞,*,*,*,*,も,モ,モ
やれよ  動詞,自立,*,*,一段,命令yo,やれる,ヤレヨ,ヤレヨ
!      記号,一般,*,*,*,*,!,!,!
】      記号,括弧閉,*,*,*,*,】,】,】

        記号,空白,*,*,*,*,
,*,*
感傷    名詞,一般,*,*,*,*,感傷,カンショウ,カンショー
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
浸る    動詞,自立,*,*,五段・ラ行,基本形,浸る,ヒタル,ヒタル
の      名詞,非自立,一般,*,*,*,の,ノ,ノ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
誰      名詞,代名詞,一般,*,*,*,誰,ダレ,ダレ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
でも    助詞,副助詞,*,*,*,*,でも,デモ,デモ
できる  動詞,自立,*,*,一段,基本形,できる,デキル,デキル
現実    名詞,一般,*,*,*,*,現実,ゲンジツ,ゲンジツ
逃避    名詞,サ変接続,*,*,*,*,逃避,トウヒ,トーヒ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
手段    名詞,一般,*,*,*,*,手段,シュダン,シュダン
。      記号,句点,*,*,*,*,。,。,。
そんな  連体詞,*,*,*,*,*,そんな,ソンナ,ソンナ
もの    名詞,非自立,一般,*,*,*,もの,モノ,モノ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
浸っ    動詞,自立,*,*,五段・ラ行,連用タ接続,浸る,ヒタッ,ヒタッ

janomeの応用

janome 応用

今までは、単語と品詞が同時にリストに格納されています。なので、『単語だけ』、『ある品詞だけ』のように、特定のものだけを抽出していく方法を紹介します。

単語だけ抽出

これはとても簡単です。7行名のTokenizer()メソッドの引数にwakati=Trueと入れるだけです。

Python
from janome.tokenizer import Tokenizer

# テキストファイルのパス
file_path = 'テキストデータが入ったファイル名.txt'

# JanomeのTokenizerオブジェクトを作成
tokenizer = Tokenizer(wakati=True)

# テキストデータを読み込み、形態素解析を行う関数
def analyze_text(text):
    tokens = tokenizer.tokenize(text)
    for token in tokens:
        print(token)

# テキストファイルを読み込み、形態素解析を行う
with open(file_path, 'r', encoding='utf-8') as file:
    text_data = file.read()
    analyze_text(text_data)

結果を見てみましょう

Python

感傷

浸る




そんな
こと
より

やれよ




感傷

浸る

しっかりと、単語だけリストに格納されていることが分かりますね。そうです!とっても簡単なんです!

特定の品詞だけを抽出する
Python
from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.tokenfilter import POSKeepFilter

# テキストファイルのパス
file_path = 'テキストデータが入ったファイル名.txt'

# JanomeのTokenizerオブジェクトを作成
tokenizer = Tokenizer()

# POSKeepFilterを使って動詞のみを抽出する関数
def extract_verbs(text):
    # Tokenizerオブジェクトを使用して形態素解析を行い、POSKeepFilterで品詞を絞り込む
    token_filters = [POSKeepFilter(['動詞'])]
    analyzer = Analyzer(tokenizer=tokenizer, token_filters=token_filters)
    verbs = []

    # 形態素解析を行い、動詞を抽出する
    for token in analyzer.analyze(text):
        verbs.append(token.surface)
    
    return verbs

# テキストファイルを読み込み、動詞を抽出する
with open(file_path, 'r', encoding='utf-8') as file:
    text_data = file.read()
    verbs = extract_verbs(text_data)
    print("抽出された動詞:")
    print(verbs)

結果はこんな感じです。もし、他の品詞を抽出したい場合は14行目の引数を変えればいいだけです。

抽出された動詞:
['浸る', 'やれよ', '浸る', 'できる', '浸っ', 'い', '起き', 'やれ', '落ち込ん', 'でる', '奮い立た', 'せろ', 'でき', 'できる', 'なれ', '備わっ', 'てる', 'わかっ', 'てる', 'やれ', '頼む', '動い', 'くれ']


おまけ(名詞の場合);
['感傷', 'の', '楽', 'こと', '感傷', 'の', '誰', '現実', '逃避', '手段', 'もの', '何', '暇', 'お前', '時間', '勿体', '自分', 'ぁ', ' ー', 'よう', 'お前', '力', 'メンタル', 'それ', '俺', '自信', '一番']

おわりに

今回は、機械学習の一つである自然言語処理(NLP:Natural Language Processing)における前処理をやってきました。また、JanomeというPythonライブリの機能も試しました。

単語を分割するスキルはとても大切なので、できるようになっておきましょう!継続してやっていけばそのうち慣れるので、どんどん実践を積んでいきましょう!

タイトルとURLをコピーしました