2016-06-14 11 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

Вы должны думать о случайном выборе слов, которые не должны совпадать, как '' awful ". Нет простого ответа. Начните с 'agrep (« awesome », x, max.distance = 0.5, ignore.case = TRUE)', чтобы увидеть, как работает расстояние Левенштейна. –

+0

Возможно, вы ищете http://datascience.stackexchange.com/ – Frank

ответ

0

Вы желающий сделать это чисто в SQL?

В противном случае вам понадобится некоторая функция сравнения строк с нечеткой совпадением для вызова в SQL. Функция будет использовать некоторую комбинацию алгоритмов, таких как Jaro-Winkler, levenshtein, ngrams, et. Или фонетическое сопоставление метафонов с двойным метафоном, метафоном 3, soundex

В зависимости от того, какой sql-сервер вы используете, вы можете установить и использовать компоненты качества данных, которые имеют пользовательскую реализацию CLR некоторых из этих алгоритмов. Или компоненты нечеткого соответствия 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.