문제

이름이 문자열로 제공되는 두 곳 사이의 물리적 거리를 측정해야합니다. 때로는 이름이 약간 다르게 쓰여지기 때문에 차이를 측정 한 다음 위도 및 경도 측정과 결합하여 올바른 일치를 선택할 수있는 라이브러리를 찾고있었습니다. 우선 언어 : Java 또는 PHP.

제안이 있습니까?

도움이 되었습니까?

해결책

살펴보십시오 Levenshtein 거리. 이것은 서로 다른 두 줄이 서로 어떻게 다른지 측정하는 방법입니다.

잘만되면 나는 당신의 질문을 올바르게 이해했습니다. "위도와 경도"와 같은 문장에서 "거리"를 사용하면 혼란 스러울 수 있습니다!

다른 팁

C (Python 및 TCL 바인딩 포함)로 작성되었지만 libdistance 문자열/데이터에 여러 거리 메트릭을 적용하는 도구입니다.

메트릭은 다음과 같습니다.

  • DAMERAU
  • 유클리드
  • 해밍
  • 자카르
  • Levenshtein
  • 맨해튼
  • Minkowski
  • Needleman_wunsch

a를 사용하여 괜찮은 결과를 얻을 수 있습니다 음성 알고리즘 약간 잘못된 이름을 찾으려면.

또한 더 기계적인 편집 거리를 사용하는 경우 키보드 형상을 설명하는 가중 함수를 사용하여 더 나은 결과가 표시 될 수 있습니다 (예 : 물리적으로 가까운 키는 멀리 떨어진 것보다 더 저렴합니다). 그것은 특허받은 방법 BTW이므로 너무 인기있는 것을 쓰지 않도록주의하십시오.)

Levenshtein 거리를 Java 코드로 계산하기 위해 작성한 C# 코드를 번역하기 위해 자유를 얻었습니다. 큰 들쭉날쭉 한 배열 대신 번갈아 가며 두 개의 단일 차원 배열 만 사용합니다.

public static int getDifference(String a, String b)
{
    // Minimize the amount of storage needed:
    if (a.length() > b.length())
    {
        // Swap:
        String x = a;
        a = b;
        b = x;
    }

    // Store only two rows of the matrix, instead of a big one
    int[] mat1 = new int[a.length() + 1];
    int[] mat2 = new int[a.length() + 1];

    int i;
    int j;

    for (i = 1; i <= a.length(); i++)
        mat1[i] = i;

    mat2[0] = 1;

    for (j = 1; j <= b.length(); j++)
    {
        for (i = 1; i <= a.length(); i++)
        {
            int c = (a.charAt(i - 1) == b.charAt(j - 1) ? 0 : 1);

            mat2[i] =
                Math.min(mat1[i - 1] + c,
                Math.min(mat1[i] + 1, mat2[i - 1] + 1));
        }

        // Swap:
        int[] x = mat1;
        mat1 = mat2;
        mat2 = x;

        mat2[0] = mat1[0] + 1;
    }

    // It's row #1 because we swap rows at the end of each outer loop,
    // as we are to return the last number on the lowest row
    return mat1[a.length()];
}

엄격하게 테스트되지는 않지만 잘 작동하는 것 같습니다. 그것은 내가 대학 운동을 위해 만든 파이썬 구현을 기반으로했습니다. 도움이 되었기를 바랍니다!

나도 추천 할 것입니다 Levenshtein 거리 아니면 그 자카 카드 거리 텍스트를 비교합니다.

나는 찾았다 여름 Java에서는 사용하지 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top