-4

取得したデータがクリーンでなく、使用されている単語のバリエーション、スペルミス、または操作されている場合があります。文中の単語が最も似ている例を見つけることができるでしょうか?

たとえば、次のような文のバリエーションとして使用されている「Awesome」という単語を探している場合

"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..
4

2 に答える 2

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を使用してドキュメントをトークン化し、 libblevenshteinなどのスペル修正と組み合わせることができます。

于 2016-06-18T19:44:13.753 に答える
0

これを純粋に SQL で行いたいですか?

それ以外の場合は、あいまい一致の文字列比較関数を SQL で呼び出す必要があります。この関数は、Jaro-Winkler、levenshtein、ngrams などのアルゴリズムの組み合わせを使用します。または音声マッチング metaphone double metaphone、metaphone 3、soundex

使用している sql-server に応じて、これらのアルゴリズムの一部のカスタム CLR 実装を持つ Data Quality Components をインストールして使用できます。または、SSIS ファジー マッチング コンポーネント。または.....

私は個人的にそれを行うために c# .net clr 関数をコーディングしましたが、私は名前だけを扱っています。

于 2016-06-14T20:16:12.733 に答える