エビフライの唐揚げ

今までのことや、技術的なこと、その他を書いていこうと思います。

【超軽量】Pythonで文章の類似度を調べる

超軽量(辞書なし)で文章の類似度を比較できるコードを書きました

 

コードは下記の通り

import tinysegmenter


def seach(sentence1, sentence2):
    segmenter = tinysegmenter.TinySegmenter()

    words1 = segmenter.tokenize(sentence1)
    words2 = segmenter.tokenize(sentence2)

    words1 = list(filter(lambda x: len(x) > 1, words1))
    words2 = list(filter(lambda x: len(x) > 1, words2))
    
    denominator = (len(words1) + len(words2)) / 2

    molecule = len(set(words1) & set(words2))

    return molecule / denominator

 

使い方(類似度が最大1で返ってきます。下記では、0.6以上の一致度を表示しています)

import doc_similar
import csv

hikaku = "比較したい文章"

with open(r'article.csv') as f:
    reader = csv.reader(f)
    for row in reader:
        similar = doc_similar.seach(hikaku,row[1])#ここで比較実行
        if similar > 0.6:
            print(row[1]+','+str(similar))

 

1.コードについて

ほぼ、「tinysegmenter」に頼ってます、こいつの紹介になるのかもしれないです
「tinysegmenter」はロジックで形態素分かち書きしてくれるライブラリです
もちろん、これを使う前に「pip install tinysegmenter」してくださいね

 

2.軽量であることの利点

形態素解析というと、MeCabやらJanomeが有名ですが、どれも辞書基準で形態素解析をしています
そのため、重いんですよねMeCabの最新の言葉とか取り入れた辞書なんて1GB弱で、ただファイルサイズが大きいだけならまだしも
メモリ上に展開するので動作環境によっては厳しいんです。
無料の環境(HEROKU)とかね


3.作った経緯

何か大きい事件やら起きるとテレビもニュースサイトでもずーーーっと同じ内容の記事が出まくりますよね
それがうざったいのでフィルタを掛けたかったのです

f:id:littlemore:20200723101440p:plain


4.課題点

もっとも、ちゃんと比較するには「Doc2Vec」とか使ったほうが良いでしょう
「Word2Vec」では学習モデル作ったり結構大変でした。