단어 유사성에 대한 Regexp "n 문자 차이"
이와 같은 단어가 있다고 가정합니다. mert. 해당 단어의 문자 차이 조합을 모두 검색하려고 합니다.aert, ert, meat, mmert, merst, mert 등이 모두 해당된다.그래서 저의 정규표정은
[a-z]{0,2}ert OR m[a-z]{0,2}rt OR me[a-z]{0,2}t OR mer[a-z]{0,2}
따라서 n개의 글자 차이에 대해 2를 n-1로 대체하면 모든 조합을 얻을 수 없습니다.
제 질문은 이것입니다. 이 정규식을 좀 더 짧게 쓸 수 있는 방법은 없습니까?
감사합니다.
이 솔루션을 확인해 주세요.아래의 코드를 테스트하고 있습니다.효과가 있는 것 같아요.
/**
* Then function will return list of the words matched with nth_difference
*
* @param pattern search pattern
* @param data input data
* @param nth_difference difference
* @return
*/
static List<String> getNthDifferenceWords(String pattern, String[] data, int nth_difference) {
Map<Character, Integer> frequencyTable = new HashMap<>();
List<String> matchedWords = new ArrayList<>();
//Code complexity : O(n)
for (int i = 0; i < pattern.length(); ++i) {
frequencyTable.put(pattern.charAt(i), 1);
}
//Code complexity : O(m) where m is size of entire input;
for (String input : data) {
int matchCounter = 0;
for (int j=0; j<input.length(); ++j){
if(frequencyTable.containsKey(input.charAt(j))){
++matchCounter;
}
}
//System.out.println("matched=" + matchCounter);
if(input.length() <= pattern.length() && (matchCounter == pattern.length() - nth_difference)){
matchedWords.add(input);
}
if((input.length() - pattern.length() == 1) && (matchCounter >= input.length() - nth_difference)){
matchedWords.add(input);
}
}
return matchedWords;
}
public static void main(String[] args) {
int nth_difference = 1;
String pattern = "mert";
String[] data = new String[]{"aert", "ert", "meat", "mmert", "merst", "merts","meritos"};
System.out.println(getNthDifferenceWords(pattern,data,nth_difference));
nth_difference = 2;
pattern = "merit";
data = new String[]{"aert", "ert", "meat", "mmert", "merst", "merts","demerit","merito", "meritos"};
System.out.println(getNthDifferenceWords(pattern,data,nth_difference));
}
1글자의 차이에 대해서는 다음 방법으로 표를 미리 작성합니다.두 번째 열에 'word'를 입력하고 첫 번째 열에 다음을 포함한 2열 어휘를 작성합니다.한 번에 한 자리씩 단어에서 한 글자를 제거합니다.
예: "meat"은 단어입니다. 표에 해당 행이 나와 있습니다.
`col1` `col2`
------ ------
meat meat
eat meat
mat meat
met meat
mea meat
"meet"(듀프 문자 메모)의 경우:
meet meet
eet meet
met meet -- only needed once
mee meet
그런 다음 비슷한 방법으로 테스트합니다."mert"를 검색할 때 다음을 수행합니다.
WHERE col1 IN ('mert', 'ert', 'mrt', 'met', 'ert')
위의 예에서 "meat"과 "meet"을 모두 얻을 수 있습니다.또, 「met」와「meets」의 동작도 적어 둡니다.
그리고 간단한 전이를 체크합니다.메타 검색 중:
WHERE col1 IN ('meta', 'eta', 'mta', 'mea', 'met')
"meat", "meet", "meet", "meat", "meat", "mean"과 같은 다른 단어들을 찾을 수 있습니다. 거의 틀림없이 "meta" -> "mean"은 두 글자의 거리이지만, 아, 그렇군요.
테스트 케이스 체크 - 머트 vs
aert - "ert" 경유
ert - "ert" 경유
고기 - "met" 경유
mmert - "mert" 경유
merst - "mert" 경유
merts - "mert" 경유
한편,PRIMARY KEY(col1, col2), INDEX(col2)
그 테이블 위에.
언급URL : https://stackoverflow.com/questions/54553896/regexp-for-word-similarity-n-letter-difference
'programing' 카테고리의 다른 글
컬 오류 60, SSL 인증서 문제: 인증서 체인의 자체 서명된 인증서 (0) | 2022.09.30 |
---|---|
지속성 단위는 RESOURCE_LOCAL 또는 JTA로 지정됩니까? (0) | 2022.09.30 |
Java에서 분수를 표시하는 가장 좋은 방법? (0) | 2022.09.23 |
추가 Bootstrap popover가 프로그래밍 방식으로 vue-full-calendar. (0) | 2022.09.23 |
Python site-packages 디렉토리의 위치를 찾으려면 어떻게 해야 합니까? (0) | 2022.09.23 |