테이블에는 수천 개의 인기 음악 밴드가 있으며 이러한 이름은 다른 방식으로 쓸 수 있습니다. 예를 들면 :
각 행에는 group_id 필드가 있습니다. 그리고이 필드는 모든 유사한 아티스트에 대해 동일해야합니다. 예를 들어, 그룹에서 가장 작은 ID :
id | name | group_id
-------------------------------------------------------
1137 | "Red Hot Chili Peppers in Hungary" | 1137
1138 | "Concert Red Hot Chili Peppers" | 1137
1139 | "Red Hot Chili Peppers" | 1137
1140 | "Red Hot (Live in CA)" | 1137
이제 모든 행 의 group_id 가 비어 있습니다. 비슷한 이름을 올바르게 결합하고 group_id를 할당하는 방법은 무엇입니까?
재미를 위해 여기에 gordon이 언급 한 levenstein에 대한 샘플 Postgres 코드 (어떤 RDBMS를 사용하고 있습니까?)가 있지만 문제는 그렇게 간단하지 않습니다.
create extension fuzzystrmatch
create table t (id serial, txt text)
insert into t(txt) values('Red Hot Chili Peppers in Hungary');
insert into t(txt) values('Concert Red Hot Chili Peppers');
insert into t(txt) values('Red Hot Chili Peppers');
insert into t(txt) values('Red Hot (Live in CA)');
select a.txt a, b.txt b, levenshtein(a.txt, b.txt) from t as a inner join t as b on a.id < b.id
반환하는
"Red Hot Chili Peppers in Hungary";"Concert Red Hot Chili Peppers";19
"Red Hot Chili Peppers in Hungary";"Red Hot Chili Peppers";11
"Red Hot Chili Peppers in Hungary";"Red Hot (Live in CA)";18
"Concert Red Hot Chili Peppers";"Red Hot Chili Peppers";8
"Concert Red Hot Chili Peppers";"Red Hot (Live in CA)";19
"Red Hot Chili Peppers";"Red Hot (Live in CA)";11
그러나 이제이 거리 (마지막 열의 숫자)로 무언가를해야합니다. 숫자가 클수록 거리가 멀수록 거리가 멀수록 덜 유사합니다. 따라서 각 문자열을 점수에 바인딩하는 조회 테이블을 쉽게 만들 수 있지만 항목이 여러 그룹에 속하게되어 실제로 그룹화되지 않습니다.
보유한 데이터의 양에 따라 데이터를 꺼내고, KMeans와 같은 것으로 클러스터링 한 다음 다시 넣거나, 알려진 그룹 목록을 유지 한 다음 like 연산자를 조인에 추가 할 수 있지만 여전히 종료 할 수 있습니다. 그룹에 따라 여러 그룹의 일부 행이 있습니다.
어쨌든, 재미 있고, 이것이 도움이되기를 바랍니다. 흥미로운 문제.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다