39回「自然言語処理(2)」Janomeで文章を単語に分ける

こんにちは、小澤です。

前回は、自然言語処理の全体像と、Pythonで利用できる主なライブラリを紹介しました。また、Janomeをインストールし、短い文章を形態素解析しました。今回は、教科書の自然言語処理の流れに沿って、解析結果をもう少し詳しく見ていきます。

文章を単語に分けるだけなら、前回のコードでも実行できます。ただし、分析に使うには、表示された情報の意味を理解しておく必要があります。単語そのものと品詞の違い、基本形を使う理由を確認し、必要な単語をリストに取り出してみましょう。

形態素解析の結果を確認する

日本語の文章には、通常、単語の間に空白がありません。「商品が届きました」という文章をPythonの文字列として読み込んでも、どこが単語の区切りかは分かりません。形態素解析では、辞書などを使って文章を小さな単位に分け、品詞や活用の情報を調べます。ここでは、説明を分かりやすくするために、分けられた単位を単語と呼びます。

まずは、単語の表記、品詞、基本形を並べて表示します。Janomeが未インストールの場合は、前回と同じくpip install janomeを実行しておいてください。

from janome.tokenizer import Tokenizer

tokenizer = Tokenizer()
text = "商品が早く届きました。"

for token in tokenizer.tokenize(text):
    print(token.surface,
          token.part_of_speech,
          token.base_form)

Tokenizer()で解析に使うオブジェクトを作り、tokenize()に文章を渡します。for文では、解析された単語を一つずつ受け取り、その情報を表示しています。tokenは単語の文字列そのものではなく、表記や品詞などの情報を持つオブジェクトです。

surfaceは、文章に書かれている表記です。part_of_speechは品詞の情報、base_formは基本形を表します。たとえば、「届き」は文章中の表記ですが、その基本形は「届く」です。「ました」のような部分も分割されるので、普段、人が文章を読むときより細かく分かれることがあります。

品詞の情報を取り出す

品詞には、名詞、動詞、形容詞、助詞などがあります。「商品」は名詞、「届き」は動詞、「が」は助詞です。文章から何について書かれているかを調べたい場合、まず名詞を取り出すと、商品や配送など、話題になっているものを確認しやすくなります。

part_of_speechを表示すると、「名詞,一般,*,*」のような文字列が出てきます。カンマで区切られているのは、品詞をさらに細かく分類した情報です。今回は先頭の「名詞」「動詞」といった大きな分類だけを使います。次のコードは、先ほどのコードに続けて実行できます。

for token in tokenizer.tokenize(text):
    pos = token.part_of_speech.split(",")[0]
    print(token.surface, pos)

split(",")で文字列をカンマごとに分け、[0]で先頭の要素を取り出しています。文章を単語に分けるためにsplit()を使っているわけではありません。すでに解析された品詞の文字列から、必要な部分を取り出している点に注意してください。

なお、「便利」のような語は、Janomeの標準辞書では「名詞,形容動詞語幹」として扱われます。日常的に考える品詞と、辞書の分類が完全に一致するとは限りません。思った語が取り出せないときは、条件を変える前に、品詞の情報をそのまま表示して確認しましょう。

基本形で表記をそろえる

同じ動詞でも、文章では「届く」「届きます」「届いた」のように形が変わります。surfaceだけを数えると、「届く」と「届き」などが別々の語として集計されてしまいます。動詞や形容詞を基本形にそろえると、活用による違いをまとめられます。

ただし、基本形にすれば、あらゆる表記の違いが解消するわけではありません。「使う」と「使用する」のような言い換えや、「パソコン」と「PC」のような別の表記は、そのまま残ります。基本形にそろえる処理と、同じ意味の語をまとめる処理は分けて考えます。

また、辞書にない語などでは、基本形が「*」になる場合があります。そのまま保存すると、元の語が分からなくなってしまいます。次の例では、基本形が得られないときはsurfaceを使うようにします。

必要な単語をリストにする

今度は、商品の感想から名詞と形容詞を取り出してみます。名詞で話題を、形容詞で特徴や評価を確認するための例です。取り出した単語はwordsというリストに入れます。ここまでの処理をまとめると、次のようになります。

from janome.tokenizer import Tokenizer

tokenizer = Tokenizer()
text = "商品の説明は詳しく、価格も安かったです。"
words = []

for token in tokenizer.tokenize(text):
    pos = token.part_of_speech.split(",")[0]
    if pos in ("名詞", "形容詞"):
        word = token.base_form
        if word == "*":
            word = token.surface
        words.append(word)

print(words)

この例では、「商品」「説明」「詳しい」「価格」「安い」がリストに入ります。「詳しく」「安かった」という文章中の表記が、基本形になっていることを確認してください。if文で名詞と形容詞だけを選んでいるので、助詞の「の」「は」や、句読点はリストに入りません。

words.append(word)は、リストの末尾に単語を追加する処理です。単語を一つずつリストにしておくと、後から出現回数を数えたり、文章ごとに比較したりできます。今回は集計まで進めず、どの語が残り、どの語が除かれたかを確認しておきましょう。

データ分析やAIでどう使うのか

では、取り出した単語は、データ分析やAIでどのように使うのでしょうか。たとえば、商品のレビューが1,000件ある場合を考えてみます。一件ずつ読むのは大変ですが、形態素解析で単語を取り出し、出現回数を数えると、「価格」「配送」「説明」など、何について書かれていることが多いかを調べられます。

さらに、評価の高いレビューと低いレビューに分けて集計すれば、それぞれに多く出る単語を比較できます。評価の低いレビューで「説明」「難しい」が目立つなら、説明書や案内の内容を確認するきっかけになります。ただし、単語の件数だけでは理由までは分からないため、該当するレビューも読んで確かめます。

機械学習では、単語の出現回数などを数値に変え、文章の特徴として使います。たとえば、過去の問い合わせ文と「配送」「支払い」「返品」といった分類を組み合わせて学習させると、新しい問い合わせの分類を予測する仕組みを作れます。今回取り出した単語のリストは、その数値化に進むための準備です。

なお、ChatGPTのような大規模言語モデルでは、通常、Janomeで名詞や形容詞を取り出して入力するわけではありません。専用のトークナイザーで文章を小さな単位に分け、それを数値として扱います。分け方や学習方法は異なりますが、文章をコンピュータが処理できる形に変える、という点は共通しています。

除く単語は目的に合わせて決める

分析では、よく出てくるものの、目的に対してあまり役に立たない語を除くことがあります。このような語をストップワードと呼びます。たとえば、話題を調べたいのに「こと」「もの」ばかりが上位に出る場合、これらを除く候補にできます。ただし、すべての分析に共通する正解の一覧があるわけではありません。

品詞による絞り込みと、ストップワードの除去も別の処理です。「こと」は名詞なので、先ほどの条件では残ることがあります。特定の語を除きたい場合は、除外する語を用意し、リストに追加する前に確認する必要があります。まず解析結果を見てから、必要な条件を加えていくとよいでしょう。

特に、今後扱う極性判定では、語を減らせばよいとは限りません。「安い」と「安くない」から形容詞だけを取り出すと、どちらも「安い」が残り、否定の情報を失うことがあります。今回の名詞と形容詞を選ぶ例を、そのまま感情の判定に使えるわけではない点は押さえておいてください。

実際のデータで確認すること

商品名や会社名、略語などは、意図しない位置で分割される場合があります。短い例文で動いたら、実際に分析したい文章も数件試してみます。気になる語は元の文章と解析結果を並べて確認すると、分割の問題なのか、品詞を選ぶ条件の問題なのかを調べやすくなります。

元の文章は残しておきましょう。加工した単語のリストだけでは、後から除外条件を見直すときに困ります。また、複数の文章を扱う場合は、一つの大きなリストにまとめる前に、文章ごとの区切りを保つことも大切です。どの文章にどの語が含まれていたかは、次回の数値化でも必要になります。

今回のまとめ

今回は、Janomeの解析結果から表記、品詞、基本形を確認し、名詞と形容詞をリストに取り出しました。残す語を決めるときは、分析したい内容に合っているか、必要な情報まで消していないかを確認しましょう。

次回は、単語の出現回数を使って文章を数値で表すBag of Wordsを紹介します。レビューや問い合わせを例に、複数の文章でどの単語が多く使われているかを比較する方法を見ていきます。次回もお楽しみに。

PAGE TOP