2016-06-14 10 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によっては、これらの属性のカスタム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などのスペルの修正と組み合わせることができます。

関連する問題