はじめに
今回から、機械学習の一つである自然言語処理(NLP:Natural Language Processing)の実装やっていきます。機械学習と聞くと、難しそうですが実際はとても簡単です。このページを通してそれを実感してもらえたら嬉しいです。
【今日のゴール】
まずは、前処理をできるようにしたいです。そのため、今日のゴールは「文章から動詞だけを抽出する」に設定します。また、今回はJanomeと呼ばれるpythonライブラリを使ってやっていきます。
では、早速やっていきましょう!
仮想環境の作成
まずは仮想環境を作成していきましょう。このステップはお好みで判断してください。
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と同じディレクトリにしましょう。
仮想環境には以下のメリットがあります。
- プロジェクトごとの環境の分離
- クリーンアップの容易化
ライブラリのインストール
今回はjanomeというpythonライブラリを使っていきます。
cd Scripts #Scriptsディレクトリに移動
pip install janome #janomeをインストール
【Janomeの特徴】
- Pythonで書かれた自然言語処理(NLP)のライブラリです。
- 主に日本語のテキスト処理に特化しています。
- また、テキストを形態素(単語やそれに類する単位)に分割するためのツールです。
テキストデータを準備
適当なテキストデータ(コーパス)がある方は適当にそれを使ってください。もし、無い人は以下に中二病前回なデータを載せておくので、それをコピペして使ってみてください。
『ファイル名.txt』というファイルをScripts直下につくり、文章をそこにコピペすれば準備完了です。
プログラミング
では、実際にプログラミングしていきましょう!
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の応用
今までは、単語と品詞が同時にリストに格納されています。なので、『単語だけ』、『ある品詞だけ』のように、特定のものだけを抽出していく方法を紹介します。
単語だけ抽出
これはとても簡単です。7行名のTokenizer()メソッドの引数にwakati=Trueと入れるだけです。
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)
結果を見てみましょう
【
感傷
に
浸る
の
は
楽
。
そんな
こと
より
も
やれよ
!
】
感傷
に
浸る
の
は
しっかりと、単語だけリストに格納されていることが分かりますね。そうです!とっても簡単なんです!
特定の品詞だけを抽出する
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ライブリの機能も試しました。
単語を分割するスキルはとても大切なので、できるようになっておきましょう!継続してやっていけばそのうち慣れるので、どんどん実践を積んでいきましょう!