나는 90,000 개가 넘는 이름이있는 목록이 제공되었습니다. 나는 유사성이 50 % 이상인 이름을 검사하고 그 결과를 다음 형식으로 파일에 씁니다 :빠른 알고리즘을 사용하여 유사성 문자열 비교
ID 1, ID 2, 유사성 비율.
이미 유사성을 확인하는 알고리즘이 있지만 전체 목록을 반복하는 데 많은 시간이 걸립니다. 다른 사람이 이름을 비교하는 빠른 알고리즘을 도와 줄 수 있습니까?
아래 코드
public static void main(String[] args) throws IOException {
List<String> list = new ArrayList<>();
int count = 0;
FileWriter f = new FileWriter(new File("output.txt"));
StringBuilder str = new StringBuilder();
Scanner scanner = new Scanner(new File("name.csv"));
while (scanner.hasNextLine()) {
count++;
list.add(scanner.nextLine());
}
long start = System.currentTimeMillis();
//////////////////////////////////////////////////////////
for (int i = 0; i < list.size(); i++) {
for (int j = i + 1; j < list.size(); j++) {
int percent = StringSimilarity.simi(list.get(i), list.get(j));
if (percent >= 50) {
str.append("ID " + i + ",ID " + j + "," + percent + " percent");
str.append("\n");
}
}
}
////////////////////////////////////////////////////////
long end = System.currentTimeMillis();
f.write(str.toString());
System.out.println((end - start)/1000 + " second(s)");
f.close();
scanner.close();
}
public static String getString(String s) {
Pattern pattern = Pattern.compile("[^a-z A-Z]");
Matcher matcher = pattern.matcher(s);
String number = matcher.replaceAll("");
return number;
}
이 데이터가 어떻게 보이는지의 샘플입니다 ..... 이름은에 저장됩니다. csv 파일이므로 파일을 읽고 목록에 이름을 저장했습니다.
이름, 성, 기타 NAME, 어머니의 이름
킹슬리, 겔, 벤, CICI
겔, 다니엘, 벤, 줄리
존 스미스, 켈리, 조
조셉 황갈색, chellie
조셉 황갈색 헤세 로드리게스, chellie
.... 등등 사람이 최소한 3 개의 이름을 가질 수 있습니다 ..... 앞서 말했듯이 프로그램은 이름이 얼마나 비슷한 지 확인하기 위해 ID 1과 ID 2를 비교할 때 "ben" 는 공통적이며 "eze"는 공통이므로 50 %의 유사성을가집니다. ID 4와 ID 5를 비교하면 유사도가 75 퍼센트입니다 ... ID 4에 세 번째 이름이 없더라도 공통 이름이 3 개이므로 ....
두 가지 for 루프를 사용하여 유사성 검사를하면 첫 번째 ID로 시작하여 나머지 90,000 개의 이름을 통해 확인하고 ID가 50 % 이상인 ID를 저장 한 후 다음 ID 2를 취하여 같은 작업을 수행합니다. .. 등등
데이터베이스에는 종종 사용할 수있는 ** soundex ** 알고리즘이 있으며 최소한의 "동일한 소리가 나는"문자 그룹이 생성됩니다. –
"x % 유사성"은 어떻게 정의됩니까? – mm759
* * Joseph * * Joe *와 (과) 유사합니까? 어때요 * Kady *와 * Catie *? 비슷한 철자가있는 이름 뒤에 만 있습니까, 아니면 비슷한 소리를내는 이름 뒤에 있습니까, 아니면 별명이나 별칭이 될 가능성이 있습니까? – jxh