programing

자동 완성을 위해 MYSQL과 PHP의 회사 이름을 애매하게 일치시키는 방법은 무엇입니까?

goodsources 2023. 2. 2. 21:15
반응형

자동 완성을 위해 MYSQL과 PHP의 회사 이름을 애매하게 일치시키는 방법은 무엇입니까?

사용자는 회사 이름이 포함된 큰 문자열을 잘라내 붙여넣기로 Import합니다.

저는 고유한 company_id를 가진 회사 이름의 MYSQL 데이터베이스를 보유하고 있습니다.

문자열을 해석하여 사용자가 입력한 각 회사 이름에 퍼지 매칭을 할당할 수 있도록 하고 싶습니다.

지금은 스트레이트 스트링 매치만 해도 느려요.** Soundex 인덱싱이 빨라집니까?사용자가 입력할 때 몇 가지 옵션을 제공하려면 어떻게 해야 합니까?**

예를 들어 다음과 같이 기술합니다.

Microsoft -> Microsoft베어 에센셜 -> 베어 에센셜Polycom, Inc. -> Polycom

이 질문과 유사한 다음 스레드를 찾았지만 포스터가 승인되지 않아 해당 사용 사례가 적용되는지 잘 모르겠습니다.

큰 문자열 데이터베이스에서 문자열에 가장 적합한 퍼지 일치 항목을 찾는 방법

Java에서 부정확한 회사 이름 일치

를 사용하여 시작할 수 있습니다.이렇게 하면 아마 필요한 것을 얻을 수 있을 것입니다(사용자가 입력하는 것에 대해 기존의 대체 방법을 나타내는 자동 제안 상자를 생각할 수 있습니다.

「 」의 SOUNDEX()과 같습니다

  • 긴 줄을 구별할 수 없습니다.첫 번째 몇 글자만 고려되며 마지막에 분산되는 긴 문자열은 동일한 SOUNDEX 값을 생성합니다.
  • 첫 글자가 똑같지 않으면 쉽게 일치하는 글자를 찾을 수 없습니다.SQL Server에는 두 SOUNDEX 값이 얼마나 다른지 알려주는 Difference() 함수가 있지만 MySQL에는 그런 기능이 내장되어 있지 않다고 생각합니다.
  • MySQL의 경우 적어도 문서에 따르면 SOUNDEX는 Unicode 입력용으로 파손되어 있습니다.

예:

SELECT SOUNDEX('Microsoft')
SELECT SOUNDEX('Microsift')
SELECT SOUNDEX('Microsift Corporation')
SELECT SOUNDEX('Microsift Subsidary')

/* all of these return 'M262' */

보다 고도의 요구에 대해서는, 2개의 스트링의 Levenshtein 거리(「편집 거리」라고도 불린다)를 보고, 문턱값을 조작할 필요가 있다고 생각합니다.이 솔루션은 더 복잡한(=솔루션) 솔루션이지만 유연성이 향상됩니다.

주요 결점은 두 문자열 사이의 거리를 계산하기 위해 두 문자열이 모두 필요하다는 것입니다.SOUNDEX를 사용하면 사전에 계산된 SOUNDEX를 테이블에 저장하고 비교/정렬/그룹/필터를 사용할 수 있습니다.Levenshtein 거리에 따라 Microsoft와 Nzcrosoft의 차이는 2에 불과하지만, 그 결과가 나오려면 훨씬 더 오랜 시간이 걸립니다.

어쨌든 MySQL용 Levenshtein 거리 함수의 예는 codejanitor.com: Levenshtein Distance as a MySQL Stored Function(2007년 2월 10일)에서 찾을 수 있습니다.

SOUNDEX는 이에 적합한 알고리즘이지만, 이 주제에 대해 최근 진보가 이루어지고 있습니다.메타포네라고 불리는 또 다른 알고리즘이 만들어졌고, 나중에 이중 메타포네 알고리즘으로 수정되었다.나는 개인적으로 이중 메타포네의 자바 아파치 커먼스 구현을 사용했는데, 그것은 커스터마이즈 가능하고 정확하다.

Wikipedia 페이지에도 많은 다른 언어로 구현되어 있습니다.이 질문에 대한 답변은 완료되었지만, SOUNDEX에서 발견된 문제가 어플리케이션에 나타난다면 옵션이 있다는 것을 알게 되어 기쁩니다.때로는 정말 다른 두 단어에 대해 동일한 코드를 생성할 수 있습니다.그 문제를 해결하는데 도움을 주기 위해 이중 메타포가 만들어졌다.

Wikipedia에서 도난당: http://en.wikipedia.org/wiki/Soundex

Soundex 알고리즘의 결함에 대한 대응으로 Lawrence Philips는 같은 목적을 위해 Metaphone 알고리즘을 개발했습니다.필립스는 나중에 메타폰의 개량점을 개발했는데, 그는 그것을 더블 메타폰이라고 불렀다.Double-Metaphone에는 이전 코드보다 훨씬 큰 부호화 규칙 세트가 포함되어 라틴어 이외의 문자의 서브셋을 처리하고 영어에서의 단일 단어의 다른 발음을 설명하기 위해 프라이머리 부호화와 세컨더리 부호화를 반환합니다.

이중 메타포네 페이지의 하단에는 모든 종류의 프로그래밍 언어에 대한 메타포네이션 구현이 있습니다.http://en.wikipedia.org/wiki/Double-Metaphone

Python & MySQL 구현 : https://github.com/AtomBoy/double-metaphone

우선, 어떠한 형태의 음성/퍼지 매칭 알고리즘도 사용할 때는 매우 주의해야 합니다.이러한 논리는, Fuzzy, 또는 보다 간단하게 말하면, 부정확할 가능성이 있기 때문입니다.특히 회사명을 일치시킬 때 그렇습니다.

좋은 접근법은 주소 정보, 우편 번호, 전화번호, 지리 좌표 등과 같은 다른 데이터로부터 확인을 구하는 것입니다.이를 통해 데이터가 정확하게 일치할 가능성을 확인할 수 있습니다.

B2B 데이터 매칭과 관련된 모든 문제는 여기서 다루기에는 너무 많습니다.회사명 매칭에 대한 자세한 내용은 블로그(갱신 기사)에 기재되어 있습니다만, 요점은 다음과 같습니다.

  • 회사명의 가장 중요한 부분이 반드시 회사명의 선두에 있는 것은 아니기 때문에 전체 문자열을 살펴보는 것은 도움이 되지 않습니다.예를 들어 'Proctor and Gamble Company' 또는 'United Sterval'입니다.
  • 약어는 회사 이름에서 흔히 볼 수 있는 단어입니다.HP, GM, GE, P&G, D&B 등
  • 일부 회사들은 브랜드화의 일부로 고의적으로 이름을 잘못 쓰고 다른 회사들과 차별화한다.

정확한 데이터를 대조하는 것은 쉽지만, 정확하지 않은 데이터를 대조하는 것은 시간이 많이 걸릴 수 있습니다.정확하지 않은 매칭이 허용 가능한 품질인지 확인하기 위해 어떻게 검증할 것인지 검토해야 합니다.

Match2Lists.com을 구축하기 전에는 퍼지 매칭을 검증하는 데 많은 시간을 소비했습니다.Match2Lists에서는 정확하지 않은 일치를 검토할 수 있는 강력한 시각화 도구를 통합했습니다.이 툴을 사용하면, 매치 검증에 있어서 진정한 판도를 바꿀 수 있어 코스트를 삭감해, 보다 신속히 결과를 얻을 수 있습니다.

행운을 빈다!!

여기 mysql과 php의 soundex 함수에 대한 php 토론 링크가 있습니다.거기서부터 시작해서 잘 정의되지 않은 다른 요구사항으로 확장하겠습니다.

참조는 매칭을 위해 Levenshtein 방법론을 참조합니다.두 가지 문제, 1.두 단어의 차이를 측정하는 데 더 적합하고, 검색하기보다는 두 단어의 차이를 측정하는 데 더 적합합니다.2 .그것은 철자 오류(사용자가 "Levenshtein"과 "Levenshtein"의 철자 오류와 "Levenshtein"의 입력 방법을 모르는 경우)보다는 오류 교정(Levenshtien)과 같은 것을 감지하도록 설계된 솔루션에 대해 설명합니다.저는 보통 데이터베이스 내의 키 값보다는 책에서 구절을 찾는 것과 연관지을 수 있습니다.

편집: 코멘트에 대한 응답--

  1. 적어도 사용자가 회사 이름을 여러 텍스트 상자에 넣도록 할 수 있습니까? 2. 또는 명확한 이름 구분 기호(백슬래시라고 함), 3. 기사("The") 및 일반 약어(또는 이러한 약어를 필터링할 수 있음), 4.공백은 생략하고 여기에 일치시킵니다(Micro Soft = > microsoft > Bare Essentials = > bareessentials ) ) 。구두점을 걸러냅니다. 6. 단어("나급" 또는 "필수")에 대해 "OR" 검색을 수행합니다. 사람들은 불가피하게 한쪽을 제외합니다.

미친 듯이 테스트하고 사용자의 피드백 루프를 사용합니다.

퍼지 매칭을 위한 최고의 함수는 레벤슈테인이다.전통적으로 철자 검사기들이 사용하는 거니까 그렇게 하는 게 좋을 것 같아요.UDF는 이쪽에서 입수할 수 있습니다.http://joshdrew.com/

levenshtein을 사용하는 것의 단점은 잘 확장되지 않는다는 것입니다.더 좋은 생각은 테이블 전체를 맞춤법 검사기 커스텀 사전 파일로 덤프하여 데이터베이스 계층이 아닌 애플리케이션 계층에서 제안을 하는 것입니다.

이 응답으로 인해 2~3글자 이상의 입력을 사용하여 거의 모든 엔티티를 인덱스 조회할 수 있습니다.

기본적으로 두 개의 열, 단어와 키로 새 테이블을 만듭니다.퍼지 검색할 열을 포함하는 프로세스를 원래 테이블에서 실행합니다.이 프로세스에서는 원래 열에서 모든 단어를 추출하여 원래 키와 함께 단어 표에 씁니다.이 과정에서 'the', 'and' 등과 같이 일반적으로 발생하는 단어는 폐기해야 합니다.

그런 다음 다음과 같이 워드 테이블에 여러 인덱스를 만듭니다.

  • Word + 키의 일반 소문자 색인
  • 2~5번째 문자 + 키 색인
  • 3~6번째 문자 + 키 색인

    또는 단어 열에 SOUNDEX() 인덱스를 만듭니다.

일단 이것이 적용되면, 우리는 모든 사용자 입력을 받고 일반 단어 = 입력 또는 LIKE 입력%를 사용하여 검색합니다.LIKE % 입력은 하지 않습니다.모두 색인화되어 있는 처음 3개의 문자와 일치하는 것을 항상 찾고 있기 때문입니다.

원래 테이블이 방대한 경우 단어 테이블을 알파벳 청크로 분할하여 사용자의 입력이 후보 행으로 즉시 좁혀지도록 할 수 있습니다.

MySQL에서 퍼지 검색을 하는 방법을 묻는 질문이지만 이를 위해 별도의 퍼지 검색(일명 오타 허용) 엔진을 사용하는 것을 권장합니다.고려해야 할 검색 엔진은 다음과 같습니다.

  • Elastic Search (오픈 소스, 많은 기능을 갖추고 있어 조작도 복잡함)
  • Algolia (독자 사양이지만 우수한 문서를 갖추고 있어 도입 및 실행이 매우 용이함)
  • Typesense(오픈 소스, Algolia와 동일한 유형의 퍼지 검색 기능 제공)

서버 측에서 신뢰할 수 있고 제대로 테스트된 철자 검사 라이브러리를 사용하여 쿼리하기 전에 철자가 틀렸는지 확인한 후 원본 텍스트와 제안된 첫 번째 철자 검사에 대해 간단한 쿼리를 수행합니다(철자 검사에서 철자가 틀렸음이 판명된 경우).

사용할 가치가 있는 맞춤법 검사 라이브러리에 대한 사용자 정의 사전을 만들 수 있습니다. 이 라이브러리는 더 잘 알려지지 않은 회사 이름과 일치하기 위해 작성해야 할 수도 있습니다.

테이블 전체에 대해 Levenshtein 거리 계산을 수행하는 것보다 두 개의 간단한 문자열과 대조하는 것이 훨씬 빠릅니다.MySQL은 이 작업에 적합하지 않습니다.

최근에 비슷한 문제에 대처하여 알고리즘을 만지작거리는데 많은 시간을 허비했습니다. 그래서 MySQL에서 이것을 하지 말라고 경고하는 사람들이 더 많았으면 합니다.

이전에도 권장되었지만 데이터를 Excel로 덤프하여 Fuzzy Match Excel 플러그인을 사용하는 것은 어떨까요?그러면 0에서 1(1은 100%)까지의 점수가 부여됩니다.

데이터베이스에 저장되어 있는 비즈니스 파트너(회사) 데이터에 대해 이 작업을 수행했습니다.UK Companies House의 최신 데이터를 다운로드하여 그에 대한 점수를 매기십시오.

ROW 데이터의 경우 수동 프로세스를 수행해야 했기 때문에 더 복잡합니다.

언급URL : https://stackoverflow.com/questions/369755/how-do-i-do-a-fuzzy-match-of-company-names-in-mysql-with-php-for-auto-complete

반응형