programing

단어 유사성에 대한 Regexp "n 문자 차이"

javaba 2022. 9. 30. 10:34
반응형

단어 유사성에 대한 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

반응형