#!/usr/local/bin/ruby# coding: utf-8#********************************************************************# Ruby script to check a degree of string similarity by n-gram model.#********************************************************************#classStringdefsim_ngram(str,n=3)# 空白文字(半角スペース、改行、復帰、改ページ、水平タブ)は除去strings=[self.gsub(/\s+/,""),str.gsub(/\s+/,"")]lengths=strings.map{|s|s.split(//).size}# 文字列の文字数が N より少なければ例外スローraise"Length of a self string is shorter than N(=#{n})"iflengths[0]<nraise"Length of a target string is shorter than N(=#{n})"iflengths[1]<n# N 文字ずつ分割arrays=strings.map{|s|s.chars.each_cons(n).collect(&:join)}# 重複要素数count_dup=(arrays[0]&arrays[1]).size# 全要素数count_all=(arrays[0]+arrays[1]).uniq.size# 類似度返却returncount_dup/count_all.to_fendendstr_1="良識はこの世のものでもっとも公平に配分されている"str_2="良識はこの世でもっとも公平に分け与えられているものである"putsstr_1putsstr_2puts"String similarity(1-gram): #{str_1.sim_ngram(str_2,1)}"puts"String similarity(2-gram): #{str_1.sim_ngram(str_2,2)}"puts"String similarity(3-gram): #{str_1.sim_ngram(str_2)}"puts"String similarity(4-gram): #{str_1.sim_ngram(str_2,4)}"