更新時(shí)間:2022-12-15 11:48:10 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2597次
用 Java 編寫的獨(dú)立 CSV 數(shù)據(jù)加載過程,它必須使用一些模糊字符串匹配。使用名字和姓氏進(jìn)行匹配,并在運(yùn)行開始時(shí)緩存所有可能性。找到匹配項(xiàng)后,需要那個(gè)人在運(yùn)行期間在多個(gè)地方對(duì)象。使用番石榴Objects.hashCode()從名字和姓氏中創(chuàng)建了一個(gè)散列。
緩存機(jī)制如下所示:
Map<Integer,PersonDO> personCache = Maps.newHashMap();
for(PersonDO p: dao.getPeople()) {
personCache.put(Objects.hashCode(p.getFirstName(),p.getLastName()), p);
}
大多數(shù)時(shí)候,在 firstname+lastname 上都能找到匹配項(xiàng),但當(dāng)它沒有匹配到時(shí),就回過頭來使用 ApacheStringUtils.getLevenshteinDistance()來嘗試匹配它。匹配邏輯流程是這樣的:
person = personCache.get(Objects.hashCode(firstNameFromCSV,lastNameFromCSV));
if(person == null) {//fallback to fuzzy matching
person = findClosetMatch(firstNameFromCSV+lastNameFromCSV);
}
這是findClosetMatch()方法:
private PersonDO findClosetMatch(String name) {
int min = 15;//initial value
int testVal=0;
PersonDO matchedPerson = null;
for(PersonDO person: personCache.values()) {
testVal = StringUtils.getLevenshteinDistance(name,person.getFirstName()+person.getLastName());
if( testVal < min ) {
min = testVal;
matchedPerson = person;
}
}
if(matchedPerson == null) {
throw new Exception("Unable to find person: " + name)
}
return matchedPerson;
}
這適用于簡(jiǎn)單的拼寫錯(cuò)誤、錯(cuò)別字和縮短的名稱(即 Mike->Michael),但是當(dāng)完全丟失緩存中的一個(gè)傳入名稱時(shí),最終會(huì)返回誤報(bào)匹配。為了防止這種情況發(fā)生,將最小值設(shè)置findClosetMatch()為 15(即不超過 15 個(gè)字符);它大部分時(shí)間都有效。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743