【超軽量】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.作った経緯
何か大きい事件やら起きるとテレビもニュースサイトでもずーーーっと同じ内容の記事が出まくりますよね
それがうざったいのでフィルタを掛けたかったのです
4.課題点
もっとも、ちゃんと比較するには「Doc2Vec」とか使ったほうが良いでしょう
「Word2Vec」では学習モデル作ったり結構大変でした。