MENU

文章から指定した文字との類似度を調べる

f:id:hanamichi_sukusuku:20210120212844p:plain

実行結果

f:id:hanamichi_sukusuku:20210120212911p:plain

このプログラムは文章から任意の文字との類似度を出力するプログラムである。

今回の場合、「至急」という文字との類似度を確認できることで文章の緊急度合いがわかるようになる。

実行結果を見ると一つ目の文章の一部が数値が高くなっている。おそらく「急いで」部分で数値が高くなっている。

Word2Vecのモデルとmecabの用意

model = word2vec.Word2Vec.load("./wiki.model")
tagger = MeCab.Tagger("-d /var/lib/mecab/dic/mecab-ipadic-neologd")
tagger.parse("")

 

以前作成したwiki.modelというwikipediaのデータから作成したモデルを読み込み。

tagger.parse("")を記述することでMeCabで使用している標準の文字エンコードに初期化しているんだと思う(一応この記述なくても出力は同じだけど)

 

関数の呼び出し

print_emargency("PCが起動しなくなりました。急いでいます。")
print_emargency("使い方がよくわかりません。")

 

渡されたテキストに含まれる各単語と「至急」の類似度を表示

def print_emargency(text):
  print(text)
  #渡されたテキストを形態素解析
  node = tagger.parseToNode(text)
  while node is not None:
  #ストップワードを除く
  fields = node.feature.split(",")
  if fields[0] == '名詞' or fields[0] == '動詞' or fields[0] == '形容詞':
  #至急との類似度を表示する
     print(model.wv.similarity(node.surface, '至急'))
  node = node.next

 

tagger.parseToNode()でnodeにsurface(単語)feature(品詞情報)を持つ解析結果を代入している。parseToNode()の返り値は単語、品詞情報を持ったオブジェクトを返す。

 

node.feature.split(",")では品詞情報を取得している。このメソッドでは単語の表層形以外のものを取得しており品詞情報が文字列で取得されるのでsplit(",")でリストを作成している。

そしてif文で変数fieldsの先頭の要素(品詞)を取得して名詞、動詞、形容詞の時に「至急」との類似度を出力している。

 

model.wv.similarity()では指定した単語の類似度を評価できる。単語、品詞情報を持ったオブジェクトnodeからsurface(表層形を取得するメソッド)で表層形を取得して「至急との類似度を出力。

 

node=node.nextをすることで次の要素の処理に進める。これをしないと無限ループになる。