7

学校のプロジェクトの場合、目標は、クエリ文字列と Song オブジェクト内の歌詞文字列のあいまい一致を実行することです。全体的なデータ構造は、歌詞にその単語を含む曲のセットとペアになった一意の単語の TreeMap です。

クエリ文字列を含む曲の予備一致セットがあります。ここでひねりを加えたのは、各結果の曲に、マッチ セクションの文字数 (スペースを含む) に基づいてランクを割り当てる必要があることです。たとえば、「彼女はあなたを愛している」を検索すると、次の一致が返されます。

「... 彼女はあなたを愛している...」 ビートルズ、ランク= 13
"... 彼女はあなたを愛している..." ボニー・レイット、ランク= 18
"... 彼女は私を愛している、まああなた..." エルヴィスプレスリー、ランク=23

結果をソートするために使用しているのは次のとおりです。

for (int i=0; i<lyrics.length; i++) {
  if (lyrics[i].equals(query[0])) { //got the start point
  start=i; //adjust the start index point

  //loop through lyrics from start point
  for (int j=1; j<query.length; j++) {
    if (lyrics[j].equals(query[query.length-1])) {
        end=i; //found the last word
    }

    //if next lyric word doesn't match this query word
    if (!lyrics[i+j].equals(query[j])) {

    //advance loop through lyrics. when a match is found, i is adjusted to
    //the match index
    for (int k= i+j+1; k<lyrics.length; k++) {
        if (lyrics[k].equals(query[j]) || lyrics[k].equals(query[0]))
            i=k++;
        } //end inner advance loop

    } //end query string test

  }//end query test loop

  song.setRanks(start, end); //start and end points for the rank algorithm.

} //end start point test

結果セット内のすべての曲には特定の順序でクエリ ワードが含まれているため、すべてが結果の印刷出力に含まれるわけではありません。このアルゴリズムを使用して、クエリが特定の長さに一致しない場合にセットから曲を削除するトリガーを設定するにはどうすればよいですか?

編集 - Lucene はこれに対する解決策ですか? これはプロジェクトの灰色の領域であり、明日のクラスで取り上げます。彼は、このプロジェクトのデータ構造を選択することを許可していますが、文字列の一致に別の実装を使用することが成功するかどうかはわかりません。

Edit 2 @ belisarius- ここで編集距離がどのように適用されるかわかりません。レーベンシュタイン距離の最も一般的な適用では、長さ n の文字列 a と長さ m の文字列 b が必要であり、距離は a==b に必要な編集の数です。このプロジェクトでは、開始点と終了点が不明な、一致するキャラクターのランクのみが必要です。上記のコードにいくつかの変更を加えて、開始点と終了点を正確に見つけています。私が必要としているのは、歌詞が何らかの形で検索に適合しない場合に、セットから一致しないものを削除する方法です。

4

2 に答える 2

1

おそらく、レーベンシュタイン距離を確認したいと思うでしょう。Apache commons-langライブラリは、バージョン2.1のStringUtilsクラスで実装しました。

于 2010-11-30T14:09:49.723 に答える
0

パトリシア・トライがあなたのためにやってくれるかもしれません。

これを見て、必要なものがあるかどうかを確認してください。

http://code.google.com/p/patricia-trie/

于 2010-11-30T09:16:29.730 に答える