2016-06-14 6 views
-4

때로는 얻은 데이터가 깨끗하지 않고 사용 된 단어의 변형, 철자 오류 또는 조작 된 경우가 있습니다. 우리는 문장에서 단어와 가장 유사한 유사 사례를 찾을 수 있습니까? 내가 "신난다"단어를 찾고 있어요 경우 예를 들어문장에서 특정 단어의 변형을 프로그래밍 방식으로 찾는 방법은 무엇입니까?

"We had an awwweesssommmeeee dinner at sea resort" 
"We had an awesomeeee dinner at sea resort" 
"We had an awwesooomee dinner at sea resort" 
etc.. 
+0

실수로 "끔찍한"것과 일치하지 않아야하는 단어를 선택하는 것에 대해 생각해야합니다. 쉬운 대답은 없습니다. Levenshtein 거리가 어떻게 작동하는지 보려면'agrep ("awesome", x, max.distance = 0.5, ignore.case = TRUE)로 시작하십시오. –

+0

아마도 http://datascience.stackexchange.com/을 찾고있을 것입니다. – Frank

답변

0

당신은 SQL에서 순수하게이 작업을 수행하고자처럼 문장의 변화로 사용 된?

그렇지 않으면 SQL에서 호출하기 위해 일부 퍼지 일치 문자열 비교 함수가 필요합니다. 이 함수는 Jaro-Winkler, levenshtein, ngrams 등과 같은 알고리즘의 조합을 사용합니다. 또는 소리 나는대로 일치하는 메타 폰 더블 메타 폰, 메타 폰 3, soundex

사용중인 sql-server에 따라 일부 algorythms의 사용자 지정 CLR 구현이있는 Data Quality 구성 요소를 설치하여 사용할 수 있습니다. 또는 SSIS 퍼지 매칭 구성 요소. 아니면 .....

나는 개인적으로 나를 위해 그것을 할 C# .net clr 함수를 코딩했으나 이름 만 다루는 반면, 문장은 더 복잡 해지고 비교를 위해 단어/토큰으로 나누기를 원할 것입니다. 부품으로 다음 전체 ....

빠른 솔루션으로
0

, 당신은 문서를 소문자 수있는 공백에 그들을 토큰 화하고, 각 용어의 연속 된 문자를 축소로 :

import java.util.Map; 
import java.util.Scanner; 
import java.util.Set; 
import java.util.TreeMap; 
import java.util.TreeSet; 
import java.util.stream.Collectors; 

public class CollapseConsecutiveCharsDemo { 

    public static String collapse(final String term) { 
     final StringBuilder buffer = new StringBuilder(); 
     if (!term.isEmpty()) { 
      char prev = term.charAt(0); 
      buffer.append(prev); 
      for (int i = 1; i < term.length(); i += 1) { 
       final char curr = term.charAt(i); 
       if (curr != prev) { 
        buffer.append(curr); 
        prev = curr; 
       } 
      } 
     } 
     return buffer.toString(); 
    } 

    public static void main(final String... documents) { 
     final Map<String, Set<String>> termVariations = new TreeMap<>(); 

     for (final String document : documents) { 
      final Scanner scanner = new Scanner(document.toLowerCase()); 
      while (scanner.hasNext()) { 
       final String expandedTerm = scanner.next(); 
       final String collapsedTerm = collapse(expandedTerm); 
       Set<String> variations = termVariations.get(collapsedTerm); 
       if (null == variations) { 
        variations = new TreeSet<String>(); 
        termVariations.put(collapsedTerm, variations); 
       } 
       variations.add(expandedTerm); 
      } 
     } 

     for (final Map.Entry<String, Set<String>> entry : termVariations.entrySet()) { 
      final String term = entry.getKey(); 
      final Set<String> variations = entry.getValue(); 
      System.out.printf("variations(\"%s\") = {%s}%n", 
       term, 
       variations.stream() 
        .map((variation) -> String.format("\"%s\"", variation)) 
        .collect(Collectors.joining(", "))); 
     } 
    } 
} 

예는 실행

% java CollapseConsecutiveCharsDemo "We had an awwweesssommmeeee dinner at sea resort" "We had an awesomeeee dinner at sea resort" "We had an awwesooomee dinner at sea resort" 
variations("an") = {"an"} 
variations("at") = {"at"} 
variations("awesome") = {"awesomeeee", "awwesooomee", "awwweesssommmeeee"} 
variations("diner") = {"dinner"} 
variations("had") = {"had"} 
variations("resort") = {"resort"} 
variations("sea") = {"sea"} 
variations("we") = {"we"} 

좀 더 정교한 해결책을 얻으려면 구두점을 올바르게 처리하는 Stanford CoreNLP tokenizer으로 문서를 토큰 화하고 liblevenshtein과 같은 맞춤법 교정과 결합 할 수 있습니다.