2017-11-03 4 views
0

mdq.Similarityの結果を、2つの単語が一致するために必要なnumber of editsに変換するにはどうすればよいですか。MS SQL Serverでmdq.SimilarityスコアをMDSの編集操作数に変換する方法は?

USE [mds] 
ALTER FUNCTION [mdq].[Similarity](@input1 [nvarchar](4000), @input2 [nvarchar](4000), @method [tinyint], @containmentBias [float], @minScoreHint [float]) 
RETURNS [float] WITH EXECUTE AS CALLER, RETURNS NULL ON NULL INPUT 
AS EXTERNAL NAME [Microsoft.MasterDataServices.DataQuality].[Microsoft.MasterDataServices.DataQuality.SqlClr].[Similarity] 

お互いがその長さを考慮しているようだ別のレーベンシュタイン距離を、生産から1つの編集離れている二つの言葉を(数:この関数は以下のように定義のMicrosoft SQL Serverのマスターデータサービス(MDS)の一部であり、単語の中の文字の)。

SELECT a=mds.mdq.Similarity('a','',0,0,0), 
ab=mds.mdq.Similarity('ab','a',0,0,0), 
abc=mds.mdq.Similarity('abc','ab',0,0,0), 
ac=mds.mdq.Similarity('ac','ab',0,0,0) 

a ab abc  ac 
0 0.5 0.67 0.5 

一方、各ペアには1つの編集(挿入、削除、置換)によって異なる2つの単語があるため、それぞれ1を返す必要があります。

答えて

1

、私は正規化されたレーベンシュタイン距離の周りを掘っ。このanswerが見つかりました。明らかに、うねりがあります:非正規化mdq.Similarityは、編集操作の数を出力します。だから、MDS機能がそれほど

の1-距離(a、b)は/最大(a.length、てb.length)

を計算し、我々は、丸めの点に注意してください(と、元のレーベンシュタイン距離をリバースエンジニアリング!!):

CREATE FUNCTION fnLevDist(@a VARCHAR(100), @b VARCHAR(100), @minScoreHint FLOAT=0) 
RETURNS INT AS 
BEGIN 
    DECLARE @scaler REAL = CASE WHEN LEN(@a)>LEN(@b) THEN LEN(@a) ELSE LEN(@b) END 
    RETURN ROUND((1.0 - mds.mdq.Similarity(@a, @b, 0, 0, @minScoreHint)) * @scaler, 0) 
END 
GO 

WITH txt AS(
SELECT a='a', b='' 
UNION ALL SELECT a='ab', b='a' 
UNION ALL SELECT a='abc', b='ab' 
UNION ALL SELECT a='ac', b='ab') 
SELECT *, Lev=dbo.fnLevDist(a,b,0), Lev_nmzd=mds.mdq.Similarity(a,b, 0, 0, 0) FROM txt 

それが大幅にパフォーマンス(see doc)を向上させることができるので、私はラッピング機能で@minScoreHintパラメータを保持してきました。出力は次のようになります。

a b Lev Lev_nmzd 
a  1 0 
ab a 1 0.5 
abc ab 1 0.667 
ac ab 1 0.5 

したがって、それほど悪くはありません。それでも、私はマイクロソフトが彼らの機械学習作業を構築する出版物を引用したことを望みます。 Python、R、およびその他のソフトウェア(GPLなど)でのパッケージドキュメントの標準的な習慣です。

+0

私はこれで遊ぶことを意味してきましたが、まだチャンスがありませんでした。それにもかかわらず、あなたがしたことは絶対に素晴らしいオレグに見えます。 –

1

できません。

この機能で役立つものは何もできませんでした。私がこれを投稿している主な理由は、google searchを実行したときに人々がmsdn documentationにアクセスできるようになるためです。

類似性スコアを返し

:MSDN、mdq.Similarityパー

。このスコアは、指定された一致アルゴリズムで比較される2つの文字列の間の類似度が であることを示します。

私はLevenshtein、Jaro、LCSSを理解していますが、この機能を長時間使って遊んだ後は、何か役に立つのは難しいです。 mdq.SimilarityはデッドエンドIMOです。

この

--Using Levenshtein edit distance algorithm. 
SELECT Lev = mdq.Similarity(N'Alexia Geogio', N'Alexandra George', 0, 0.0, 0.0); 
--Using Jaccard similarity coefficient algorithm. 
SELECT Jacc = mdq.Similarity(N'Alexia Geogio', N'Alexandra George', 1, 0.0, 0.0); 
--Using Jaro-Winkler distance algorithm. 
SELECT jaro = mdq.Similarity(N'Alexia Geogio', N'Alexandra George', 2, 0.0, 0.0); 
--Using longest common subsequence algorithm. 
SELECT lcss = mdq.Similarity(N'12345', N'93459', 3, 0.0, 0.0); 

返しアランの答えに触発さ

Lev 
---------------------- 
0.5625 

Jacc 
---------------------- 
0.269230769230769 

jaro 
---------------------- 
0.878846153846154 

lcss 
---------------------- 
0.6 
+0

こんにちは。リンクありがとう。確かに、私はBing、Google、Yahooでドキュメントを見つけることに失敗しました。 Levenshteinが 'Similarity'でどのように計算されるかについての正確な公式はありませんか?私は必要な元の編集距離を取り戻すことができました。あるいは、実際に何が計算されているかを明確にすることができるMicrosoftの連絡先があるかもしれません。 –

関連する問題