我收到了一个包含超过90,000个名称的列表。我需要检查相似度大于等于50%的名称,并将结果以以下格式写入文件:
ID 1,ID 2,相似度百分比。
我已经有一个检查相似度的算法,但是遍历整个列表需要很长时间。是否有人能提供一种更快速的算法来比较名称?
以下是代码:
这是数据的一个示例,名字被存储在一个 .csv 文件中,所以我读取了这个文件,并将名字存储在列表中。
名字至少包括名、姓、其他名和母亲的婚前姓氏。
Kingsley, eze, Ben, cici
Eze, Daniel, Ben, julie Jon, Smith, kelly, Joe Joseph, tan, , chellie Joseph,tan,jese,chellie ......等等
一个人至少有3个名字。正如我之前所述,程序的目的是检查姓名的相似程度,因此当比较ID 1和ID 2时,“Ben”和“eze”都是共同的,因此它们具有50%的相似度。
比较ID 4和ID 5,相似度为75%......因为它们有三个共同的名字,即使ID 4没有第三个名字......
现在问题在于,在使用两个循环进行相似性检查时,我从第一个ID开始,并通过剩余的90,000个名称进行检查,并保存与其相似度≥50%的ID,然后取下一个ID 2并执行相同操作......以此类推。
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 文件中,所以我读取了这个文件,并将名字存储在列表中。
名字至少包括名、姓、其他名和母亲的婚前姓氏。
Kingsley, eze, Ben, cici
Eze, Daniel, Ben, julie Jon, Smith, kelly, Joe Joseph, tan, , chellie Joseph,tan,jese,chellie ......等等
一个人至少有3个名字。正如我之前所述,程序的目的是检查姓名的相似程度,因此当比较ID 1和ID 2时,“Ben”和“eze”都是共同的,因此它们具有50%的相似度。
比较ID 4和ID 5,相似度为75%......因为它们有三个共同的名字,即使ID 4没有第三个名字......
现在问题在于,在使用两个循环进行相似性检查时,我从第一个ID开始,并通过剩余的90,000个名称进行检查,并保存与其相似度≥50%的ID,然后取下一个ID 2并执行相同操作......以此类推。