自然言語処理:形態素解析とカスタム辞書について

形態素解析とは

形態素解析はテキストマイニング手法の1つであり、テキスト解析(分類・クラスタリング・感情分析など)の精度に関わる重要なプロセスです。

形態素解析とは自然言語処理において、文を意味のある最小単位(形態素)に分割し、それぞれの形態素に品詞情報を付与することです。形態素解析を行うためには、形態素解析器と辞書を用意する必要があります。

形態素解析はニーズに応じた選択が必要です。解析器により機能や特性が異なり、辞書により語彙の種類、更新されているかなど注意する必要があります。

辞書形態素解析器
IPADICMeCab, Janome
NEologdMeCab
Sudachi辞書Sudachi
JUMAN辞書JUMAN

形態素解析の手順

  1. テキストの入力: 解析したいテキストを入力
  2. 分かち書き: テキストを形態素に分割
  3. 品詞付与: 各形態素に対して品詞情報を付与
  4. 正規化処理: 形態素の基本形に変換

本記事では、形態素解析の代表的なツールであるSudachiPyを用いた実装方法を説明します。

形態素解析の紹介でよく使われる文の「すもももももももものうち」を使用します。どこに区切りがあるか分かりにくい文ですが、辞書に登録されている単語の品詞や連接IDやコストによって、自然な文章のつながりとなるように形態素に分割されます。

from sudachipy import tokenizer
from sudachipy import dictionary

tokenizer_obj = dictionary.Dictionary().create()
text = "すもももももももものうち"
# 形態素解析を実行
mode = tokenizer.Tokenizer.SplitMode.C  # モードはA, B, Cから選択可能
tokens = tokenizer_obj.tokenize(text, mode)
# 結果を表示
for token in tokens:
    print(token.surface(), token.part_of_speech())

##出力
すもも ('名詞', '普通名詞', '一般', '*', '*', '*')
も ('助詞', '係助詞', '*', '*', '*', '*')
もも ('名詞', '普通名詞', '一般', '*', '*', '*')
も ('助詞', '係助詞', '*', '*', '*', '*')
もも ('名詞', '普通名詞', '一般', '*', '*', '*')
の ('助詞', '格助詞', '*', '*', '*', '*')
うち ('名詞', '普通名詞', '副詞可能', '*', '*', '*')

カスタム辞書登録

テキスト解析を行うにあたり、辞書に登録のない単語が多く含まれるために思い通りの結果が得られないことがあります。そのような場合には辞書に任意の単語を登録する必要があります。

  • 辞書ファイルの作成: カスタム辞書は通常CSV形式で作成します。各行には、表層形、読み、品詞などの情報を含めます。
  • 辞書ファイルの変換: 作成したCSVファイルを辞書形式に変換します。そして、形態素解析にカスタム辞書を指定して形態素解析を行います。

はじめに登録したい単語、読みを定義します。さらに任意の品詞を定義することが出来ます。今回は「テレビ愛知」という企業名を辞書登録します。そして、品詞を「テレビ局」として登録します。

任意の品詞を登録することにより様々な分析が可能になります。テレビ番組で例えると、番組ごとに、ドラマ・ニュース・バラエティなど固有の品詞を与え、SNSの口コミを番組ジャンルごとに分析することが可能になります。

Sudachi辞書へのカスタム辞書登録について

はじめに辞書登録したい単語と読みのセットを用意し、辞書に必要な情報を追加していきます。

nouns = [
    ["テレビ愛知", "テレビアイチ"]]

rows = []
for item in nouns:
    row = {
        "見出し": normalize_text(item[0]),
        "左連接ID": 4786,
        "右連接ID": 4786,
        "コスト": 5000,
        "見出し (解析結果表示用)": normalize_text(item[0]),
        "品詞1": "名詞",
        "品詞2": "固有名詞",
        "品詞3": "一般",
        "品詞4": "テレビ局",
        "品詞5": "*",
        "品詞6": "*",
        "読み": item[1],
        "正規化表記": normalize_text(item[0]),
        "辞書形ID": "*",
        "分割タイプ": "*",
        "A単位分割情報": "*",
        "B単位分割情報": "*",
        "※未使用": "*"
    }
    rows.append(row)
df = pd.DataFrame(rows)

ここで作成したデータフレームを「user_dic.csv」として保存します。そして以下のコードで、ユーザー辞書を構築します。

import sys
import os

dist_package = "dist_packageを含むPATH"

!sudachipy ubuild -s {dist_package}/sudachidict_core/resources/system.dic -o user.dic user_dic.csv

カスタム辞書登録した場合の形態素解析結果

「テレビ愛知」という単語はもともと辞書に登録されていなかった単語でしたが、1つの単語に登録することが出来ました。さらに、品詞を「テレビ局」と設定することも出来ました。

from sudachipy import dictionary
from sudachipy import tokenizer
# カスタム設定ファイルを指定してSudachiPyの辞書を取得
dict_obj = dictionary.Dictionary(config_path="カスタム設定ファイルのPATH")
tokenizer_obj = dict_obj.create()
text = "テレビ愛知は名古屋にあるテレビ局です。"
# 形態素解析を実行
mode = tokenizer.Tokenizer.SplitMode.C  # モードはA, B, Cから選択可能
tokens = tokenizer_obj.tokenize(text, mode)
# 結果を表示
for token in tokens:
    print(token.surface(), token.part_of_speech())

##出力
テレビ愛知 ('名詞', '固有名詞', '一般', 'テレビ局', '*', '*')
は ('助詞', '係助詞', '*', '*', '*', '*')
名古屋 ('名詞', '固有名詞', '地名', '一般', '*', '*')
に ('助詞', '格助詞', '*', '*', '*', '*')
ある ('動詞', '非自立可能', '*', '*', '五段-ラ行', '連体形-一般')
テレビ局 ('名詞', '普通名詞', '一般', '*', '*', '*')
です ('助動詞', '*', '*', '*', '助動詞-デス', '終止形-一般')
。 ('補助記号', '句点', '*', '*', '*', '*')

本メディアの記事等の内容には細心の注意を払っておりますが、正確性を保証するものではありません。もし記事内に誤りや不正確な情報がございましたら、こちらのお問い合わせフォームよりご連絡ください。

当メディアは、読者の皆様からのご指摘を大切にし、内容の見直しや修正を行うことで、より有益な記事を提供していく所存です。皆様のご理解とご協力をお願いいたします。