AIに負けるな！ mecabでのkeyword生成

本記事は、[intimatemerger Advent Calendar 2023](https://qiita.com/advent-calendar/2023/intimatemerger) 14 日目記事です。

言語系の AI が非常に優れています。
そんなご時世ですが、Mecab などで使用される辞書について話していきます。
なぜかというと言語系の AI は、使うのも作るのもコストがかかります。
もちろん、金額に見合った結果を出すなら問題ないので使っていきたいです。

ただし、大量の文章を毎日解析する場合、コストと結果のバランスがちょっと悪いです。
このような状況で、効果的かつ経済的な手段が求められます。今回は、文章中のキーワードに焦点を当てています。
キーワード が何かというと、文章、またはコンテキスト内で重要な単語やフレーズを指します。
これを精度良く辞書に追加していきたいという話です。

## 辞書について

辞書にはいくつか種類があります。

1. unidic
2. neologd
3. ipadic

2,3 は更新がとまっています。
1 は、2023 年 11 月も更新されているのを確認しました。

### どれがいいのか

利用目的によりますが、neologd は最新の更新が行われていませんが、まだ利用できると考えています。
neologd はネットから情報を取得しており、そのおかげである程度の固有名詞が登録されています。

一方で、unidic は使用した感触として、国語辞典のような印象を受けました。これは、固有名詞がやや少ないことが原因かもしれません。
辞書に含まれていない人名や本のタイトルなどがあるため、我々が考えている名詞とは異なる結果が返ってくることがあります。

どちらの辞書も基本的な形態素解析には問題なく使えますが、違いは人名や物事の固有表現に関するものです。微妙な結果を生む文も存在するかもしれません。

個人的に注目したい点として、neologd を使用したときに「米俵」という文があり、その際に「米」が名詞であるにもかかわらず、国を意味すると解釈されたことがあります。
なのでこの辞書を使えば問題ないというのは残念ながらありません。

今回は、unidic を使用していきます。
理由としては、現時点で最新の web 上の言葉を解析して作成されたものであるからです。
また、neologd にくらべて固有表現は少ないですが長らく更新が行われていないので unidic を使います。

https://clrd.ninjal.ac.jp/unidic/download.html#unidic_bccwj

### ユーザ辞書

neologd も unidic も、辞書としては優れていますが、全ての言葉を網羅しているわけではありません。新しい造語が存在することも考えられるので、それらは都度ユーザー辞書に追加しています。
これにより、unidic でもある程度の固有名詞を補完でき、通常の使用に支障がないようになるでしょう。（ただし、ユーザー辞書の作成は手間がかかりますが…）

登録されていない語の例

```bash
闇バイト、頂き女子、経済対策、内閣支持率、...ect
```

## 文章から keyword を抽出

文章からキーワードを抽出するには、どのようにすればよいでしょうか。

まず、いきなりキーワードを抽出するのは難しいです。キーワードを明確に把握するためには、ある程度自分が求めるキーワードを明示的に定義することが重要です。

自分が求めるキーワードがそのまま出力される場合は、何も手を加えずに結果を確認すれば十分です。

### 単純な仕組み

キーワードは多くの場合、名詞であることがあります。Mecab を使用して名詞を抽出してみましょう。

以下は「耳をすませば」の Wikipedia のあらすじ部分から抽出された名詞の一部です。

https://ja.wikipedia.org/wiki/%E8%80%B3%E3%82%92%E3%81%99%E3%81%BE%E3%81%9B%E3%81%B0#%E3%81%82%E3%82%89%E3%81%99%E3%81%98

名詞のみ

```bash
読書、中学、3、年、月島、雫、日、父、図書、自分、本、読書、カード、天沢、聖司、名前、こと、
気、こと、自分、中、存在、感、人、思い、夏休み、雫、親友、夕子、相談、学校、ついで、宿直、
高坂、先生、図書、本、本、寄付、天沢、注、2、名前、人物、雫、寄贈、高坂、先生、うえ、
待ちぼうけ、夕子、ため、後、2、校庭、ベンチ、移動、雫、依頼、カントリー、ロード、
```

これだけでは文脈や内容が十分に理解できません。
１文字のものや、意味が怪しいものがあります。

```
ついで	名詞,普通名詞,一般,*,*,*,ツイデ,序で,ついで,ツイデ,ついで,ツイデ,和,*,*,*,*,*,*,体,ツイデ,ツイデ,ツイデ,ツイデ,0,C2,*,6695484680970752,24358
うえ	名詞,普通名詞,副詞可能,*,*,*,ウエ,上,うえ,ウエ,うえ,ウエ,和,*,*,*,*,*,*,体,ウエ,ウエ,ウエ,ウエ,"0,2",C4,*,812822594462208,2957
こと	名詞,普通名詞,一般,*,*,*,コト,事,こと,コト,こと,コト,和,コ濁,基本形,*,*,*,B1WS2WB3WB6SjShS,体,コト,コト,コト,コト,2,C3,*,3528350027096576,12836
```

ここら辺の文字は、辞書の仕様なので諦めるのがいいかもしれません。

辞書をそのまま使用しても、人間が考えるキーワードを正確に取得することは難しい可能性が高いのがわかりました。

## 表現を辞書に追加していく

私たちが考えたり、日常的に読む文章のキーワードには、一定の法則性があると感じることがあります。経済系のニュースや新しい表現の言葉を考えてみましょう。

```bash
経済対策
太陽光発電
私人逮捕
国内最大
研究成果
公開義務
```

上記の言葉は、ニュースなどで頻繁に見られる表現や最近の造語です。これらの特徴を把握しながら、自身でアルゴリズムを構築してキーワードを生成することを考えていきましょう。

### step1: 複合名詞を見つける

名詞が連続している場合、それを一つの言葉として認識すると考えます。
大雑把に連続しているものは、複合名詞としてまとめます。

```bash
コンピュータープログラム
学生寮
自動車産業
太陽光発電
健康診断
環境保護団体
未来予測
音楽コンサート
国際協力
冷蔵庫
```

### step2: 助詞、動詞、助動詞

```
本を読む
```

という一文がある文章を考えたとき、この言葉を品詞分解して考えていきます。

```
本を読む
本	名詞,普通名詞,一般,*,*,*,ホン,本,本,ホン,本,ホン,漢,ホ濁,基本形,*,*,*,*,体,ホン,ホン,ホン,ホン,1,C3,*,9584176605045248,34867
を	助詞,格助詞,*,*,*,*,ヲ,を,を,オ,を,オ,和,*,*,*,*,*,*,格助,ヲ,ヲ,ヲ,ヲ,*,"動詞%F2@0,名詞%F1,形容詞%F2@-1",*,11381878116459008,41407
読む	動詞,一般,*,*,五段-マ行,終止形-一般,ヨム,読む,読む,ヨム,読む,ヨム,和,*,*,*,*,*,*,用,ヨム,ヨム,ヨム,ヨム,1,C1,*,10853287968514731,39484
```

「本」だけを抽出した場合、ユーザーが具体的にどのように考えているのかは不明です。そのため、「読む」という文も含めて名詞と一緒にキーワードとしてまとめた方が良いでしょう。

助動詞に関しては、個人の好みによりますが、入れるかどうかは微妙です。
必要に応じて加えることも考えましょう。

### step3: 重複しているワードの対処

言葉をある程度まとめると、重複している言葉が見受けられますが、これは問題ないと考えています。
重複する言葉があるということは、それが重要な言葉である可能性があり、良いキーワードであると言えるからです。

具体的な処理手順としては、以下の２つのステップを経ることを考えています。

1. 重複率が高いもののみに絞る
2. 部分一致率が高いものを除外

2 の処理において、例えば誰かの名前の後に「大統領」や「首相」などの役職を表す文字が含まれている場合、そのキーワードを除外します。
これは部分一致率が高いものは、同一の事柄を指している可能性が高いためです。

これにより、不適切な言葉を結果から取り除くこともできます。

## 不適切な名詞？

文章を解析していると判断に迷う言葉がみられます。
それぞれに対する修正や注意点を以下に示します。

- 代名詞
  「あれ」「これ」「それ」などは代名詞に分類されますが、これらは文中の他の名詞や物事を指し示しているため、単体では意味がないことが多いです。
- 数詞
  全ての数字を名詞に登録するのは不要です。
- 助動詞
  助動詞の使用には条件が必要であり、例えば一つ前の言葉が動詞の場合など、文脈に合った条件を設定する必要があります。機械的に処理する際には、誤った単語に区切られないように慎重に判断することが重要です。
- ひらがな表現
  ひらがな表現は注意が必要であり、単体で見たときに意味が取りにくい場合があります。意味の範囲が広いため、適切な判断が難しい場合があるので除外しています。
- 長すぎる表現
  さまざまな品詞がまとまっていると長すぎる表現が生じることがあります。一定の長さ以上は除外することで、解析の効率性を向上させることができます。

## 結果

「耳をすませば」の Wikipedia をプログラムで処理します。

```bash
学校を舞台
アトリエタッセル
聖蹟桜ヶ丘店
杉の宮駅
ニューアーク方式
登場人物
魔女の宅急便
カントリーロード
天沢聖司
集英社
製作委員会
アニメ映画
映画作品
徳間書店
猫の恩返し
金曜ロードSHOW
スタジオジブリ
実写映画
```

おまけとして、流行りのアニメの Wikipedia も同様に処理してみた結果です。
漫画内で表現されている語が抽出されました。

https://ja.wikipedia.org/wiki/%E8%91%AC%E9%80%81%E3%81%AE%E3%83%95%E3%83%AA%E3%83%BC%E3%83%AC%E3%83%B3

```bash
葬送のフリーレン
フリーレン
シュタルク
アベツカサ
山田鐘人
魔法使い
七崩賢の一人
断頭台のアウラ
アウラの配下
一般攻撃魔法
一級魔法使い
史上初の貫通魔法
魔族を殺す魔法
人を殺す魔法
女神様の魔法
花畑を出す魔法
黒金の翼を操る魔法
大地を操る魔法
水を操る魔法
切る魔法
日本国内
北部高原
勇者一行
魂の眠る地
ゼーリエ
オレオール
パーティー
テレビアニメ
ミニアニメ
金曜ロードショー
金曜深夜
製作委員会
公式サイト
クロスネット局
連動データ放送
```

作成できた語をユーザ辞書に追加しておけば、同様の表現が用いられている文で名詞として認識されるようになります。

## まとめ

さまざまな辞書がありそれらを使用してキーワードを生成するのは良い考えだと思います。
しかし、辞書をそのまま使用しても、多くの人が期待する結果を得ることは難しいでしょう。

ただし、自分たちが必要とするキーワードに近づけることは誰にでも可能です。
新しい言葉や文章には構成する規則があるため、地道に文章を解析し、辞書に追加していくことで、AI にも負けない結果を生み出せると考えています。

残念ながら言語系 AI は、これらの処理を経て学習しているため、AI を使用する方が効率的でしょう。
英語にも強そうですし...。

次回の記事も面白いので是非読んでみてください！

https://qiita.com/advent-calendar/2023/intimatemerger