トップページ > プログラム > 2015年11月01日 > srdwxzCV

書き込み順位&時間帯一覧

32 位/208 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000001000001002



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
プログラミングのお題スレ Part8©2ch.net

書き込みレス一覧

プログラミングのお題スレ Part8©2ch.net
76 :デフォルトの名無しさん[]:2015/11/01(日) 15:34:04.71 ID:srdwxzCV
お題: 2つの文字列を引数としてとり、その2つの文字列の類似度をあらわす値x
(0.0 ≦ x ≦ 1.0)を戻す関数fがあるとき、与えられた文字列のリストを
類似度が高い文字列がなるべく近くになるように整列する関数gを
作成してください。

(f "a" "a") => 1.0
(f "a" "b") => 0.0
(f "fukushima" "kyoto") => 0.0
(f "fukushima" "tokushima") => 0.7142857142857143
(f "fukushima" "tokyo") => 0.0
(f "kyoto" "tokushima") => 0.0
(f "kyoto" "tokyo") => 0.3333333333333333
(f "tokyo" "tokushima") => 0.2

(g '("fukushima" "kyoto" "tokushima" "tokyo") #'f)
=> ("fukushima" "tokushima" "tokyo" "kyoto")
プログラミングのお題スレ Part8©2ch.net
80 :デフォルトの名無しさん[sage]:2015/11/01(日) 21:25:08.29 ID:srdwxzCV
>>77
fもお願いします。
ここでは、たとえばtrigramを考えていました。
もっとよい実装があればお願いします。

(defun trigram (s1 s2)
(flet ((decompose
(s)
(let* ((l (length s))
(n (if (>= l 3) (- l 3) 0))
(j (if (>= l 3) 3 l)))
(loop for i from 0 to n collect (substring s i (+ i j))))))
(let ((l1 (decompose s1))
(l2 (decompose s2)))
(let ((s1l2 (loop for i in l2 sum (funcall #'(lambda () (if (search i s1) 1 0)))))
(s2l1 (loop for i in l1 sum (funcall #'(lambda () (if (search i s2) 1 0))))))
(/ (+ s1l2 s2l1) (float (+ (length l1) (length l2))))))))

>>78
gは、たとえば『列の各要素間の類似度に比例し距離の二乗に反比例する値の総和が最大になるような列に整列する関数』を考えていました。
もっとよい実装があればお願いします。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。