
書記が数学やるだけ#798 シソーラス,カウントベースの手法
今回から自然言語処理について見ていくことにする。
問題
(2)の例文は以下を参照した:

説明
近年話題となっているChatGPTは,自然言語処理モデルの一つである。

シソーラス(類語辞典)の代表例としてWordNetが挙げられる。

次にカウントベースの手法について,例として共起行列を用いた方法を紹介する。共起行列とは,コーパス中の単語の共起頻度を要素とする行列であり,単語同士の関係性を示す。単語の類似度の指標としてコサイン類似度や相互情報量があり,これは共起行列の各行を取り出すことで計算できる。

解答
今回はNLTKというPythonのオープンソースライブラリからWordnetを用いる。
import nltk
assert(nltk.download('wordnet'))
from nltk.corpus import wordnet as wn単語検索はsynsets()より行う。
# 単語検索
wn.synsets('write')結果:
[Synset('write.v.01'), Synset('write.v.02'), Synset('publish.v.03'), Synset('write.v.04'), Synset('write.v.05'), Synset('compose.v.02'), Synset('write.v.07'), Synset('write.v.08'), Synset('spell.v.03'), Synset('write.v.10')]
NLTKには'write'の項目は複数存在しており,それぞれ異なる意味を収録している。次にこれらの意味をdefinition()を用いて抽出する。
[[x, x.definition()] for x in wn.synsets('write')]結果:
[[Synset('write.v.01'), 'produce a literary work'], [Synset('write.v.02'), 'communicate or express by writing'], [Synset('publish.v.03'), "have (one's written work) issued for publication"], [Synset('write.v.04'), 'communicate (with) in writing'], [Synset('write.v.05'), 'communicate by letter'], [Synset('compose.v.02'), 'write music'], [Synset('write.v.07'), 'mark or trace on a surface'], [Synset('write.v.08'), 'record data on a computer'], [Synset('spell.v.03'), 'write or name the letters that comprise the conventionally accepted form of (a word or part of a word)'], [Synset('write.v.10'), 'create code, write a computer program']]
類義語の検索にはlemma_names()を用いる。
print(wn.synsets('write')[0].lemma_names())結果:
['write', 'compose', 'pen', 'indite']
上位構造を示すにはhypernym_paths()を用い,繰り返すことで依存関係を繋げていく。
for x in wn.synsets('write')[0].hypernym_paths()[0]:
print(x, x.definition())類似度の比較にはpath_similarity()を用いる。
word1="write"
word2="create"
wn.synsets(word1)[0].path_similarity(wn.synsets(word2)[0])結果:
0.3333333333333333
次に共起行列を用いた手法について。例えばsayは,youとgoodbye,Iとhelloと共起関係にある。これらを全単語で集計することで共起行列が得られる。
コサイン類似度は,ベクトルの向きの関係を示したもので,-1~1の値を取る。

相互情報量は,もとは情報理論の概念で,文中における単語の頻度を加味することができる。

本記事のもくじはこちら: