2017-11-03 4 views
0

mdq.Similarity의 결과를 두 단어가 일치하는 데 필요한 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] 

서로 그 길이를 설명하는 것 같다 다른 Levenshtein 거리를 생산에서 1 편집 떨어져있는 두 단어를 (번호 :이 함수는 다음과 같이 정의 마이크로 소프트 SQL 서버의 마스터 데이터 서비스 (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을 반환해야합니다.

답변

1

, 나는 정규화 Levenshtein 거리 주변에 팠죠. 이 answer을 찾았습니다. 분명히 부풀어 오릅니다. 비정규 화 된 mdq.Similarity은 편집 작업의 수를 출력합니다. 그래서, MDS 기능은

1 거리 (A, B)/최대 (a.length, b.length를)

그래서, 우리는 반올림주의 (같은 원래의 Levenshtein 거리를 리버스 엔지니어링을 계산 !!) : 그것은 크게 성능 (see doc을 향상시킬 수 있기 때문에

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 

내가) 포장 기능에 @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는 :

은 유사성 점수를 반환합니다. 이 점수는 지정된 일치 알고리즘에 의해 비교되는 두 문자열 사이의 유사도가 임을 나타냅니다.

나는이 기능을 여러 시간 동안 놀고 난 후에 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에서 계산 대상에 대한 명확성을 줄 수있는 저자의 연락처가있을 수 있습니다. –

관련 문제