레벤슈타인 거리에서 언어 간의 유사성을 비교해 보았습니다.

소개



옛날 유럽에 살았던 적이 있습니다만, 멀티 링걸인 분이 많아서 놀라운 경험이 많이 있습니다. 한편, 예를 들면 파인애플이라는 단어가 프랑스에서도 네덜란드에서도 이탈리아에서도 Ananas이거나 하는 공통점도 있어, 각국의 말은 상당히 닮은 것일까라고 이상하게 생각한 것입니다.
거기서 오늘은, 레벤슈타인 거리의 공부의 소재로서 각국의 언어를 선택해, 그것들을 비교해 보기로 하겠습니다.

레벤슈타인 거리란?



레벤슈타인 거리는 편집 거리라고도 합니다만, 2개의 문자열이 어느 정도 다른지를 나타내는 거리의 일종입니다. 보다 구체적으로, 한 문자의 삽입, 삭제, 교체를 통해 한 문자열을 다른 문자열로 변환하는 데 필요한 최소 단계 수를 계산합니다.
예를 들어 "analytics"와 "analysis"사이의 거리를 계산한다고 가정합니다. 이 경우, ①analytics의 t를 s로 치환 ②analytics의 c를 삭제의 2회의 조작에 의해 "analytics"를 "analysis"로 변환할 수 있으므로, 레벤슈타인 거리는 2가 됩니다.

분석
↓ ①t를 s로 치환
분석
↓ ②c 삭제
분석

이 거리를 사용하여 최근 옆에 있는 단어를 찾아 바꾸어 맞춤법 오류를 수정할 수 있습니다.

환경



MATLAB R2019b를 사용하고 있습니다. 레벤슈타인 거리를 계산하기 위해 Text Analytics Toolbox도 사용합니다.

계산 단계



데이터 로드



이번은 시험판으로서 중1영어・명사1 에 있는 50어만을 픽업. 영어를 기반으로 Google 번역에서 네덜란드어, 독일어, 이탈리아어, 프랑스어로 번역합니다.
(번역 결과가 올바른지 확인할 수 없습니다)

데이터는 아래와 같은 느낌입니다.



예를 들어 5행째의 tomorrow를 보면, 네덜란드어와 독일어가 같은 철자이거나, 이탈리아어와 프랑스어가 본 느낌 비슷하거나, 라고 하는 특징을 알 수 있습니다.

레벤슈타인 거리 계산



그러면 조속히 레벤슈타인 거리를 계산해 갑니다. Text Analytics Toolbox에서 editDistance이라는 함수를 사용합니다.

예를 들어 영어와 독일어 사이의 거리를 계산하면 아래와 같이 각 단어 사이의 거리가 50개씩 계산됩니다.



언어 간의 거리 시각화



50단어 밖에 없기 때문에 데이터수로서는 적습니다만, 손쉽게 50어분의 거리를 평균해, heatmap에서 가시화해 보겠습니다. 코드는 아래.
load LanguageMat % table型で事前に用意しています。「データの読み込み」欄の画像を参照。

for ii = 1:width(LanguageMat)
    for jj = 1:width(LanguageMat)
        DistanceMat(ii,jj) = mean(editDistance(table2array(LanguageMat(:,ii)),table2array(LanguageMat(:,jj))));
    end
end

figure;
h = heatmap(LanguageMat.Properties.VariableNames,LanguageMat.Properties.VariableNames,DistanceMat);

결과는 이쪽. 거리 값이 작을수록 유사도가 높습니다.



LanguageMat 을 보고 직관적으로 느끼는 대로, 레벤슈타인 거리에서도,
· 영어와 네덜란드어가 비슷하다.
· 네덜란드어와 독일어가 비슷합니다.
· 이탈리아어와 독일어는 그다지 비슷하지 않다.
· 프랑스어와 이탈리아어는 비교적 비슷합니다.
등등의 특징을 보고 잡을 수 있었습니다.

결론



유럽의 언어 분포에서 보면(참고:디르케 세계지도장),
・영어・네덜란드어・독일어=게르만계 언어
· 이탈리아어 · 프랑스어 = 라틴어 언어
그래서, 좀처럼 힘줄에 떨어지는 결과가 되었을까라고 생각합니다.


다른 언어로도 시험해 보면, 또 재미있는 결과를 얻을 수 있을 것 같네요.

좋은 웹페이지 즐겨찾기