0

この質問は私にとって挑戦です。私の友人はその方法を教えてくれませんが、彼は本当に優れたプログラマーです (私はそう思います)。

ユーザーはデータベースに文章を入れることができます。ユーザーが文を入力すると、sentencesテーブルに保存されます。次に、文が単語に分割され、単語の各 soundex が分割されたtags文の id と共にテーブルに保存されます。

最後に、単語の各 soundax がweightsテーブルに配置されます。同じ soundex が既に存在する場合、関数はcounterこの soundex に 1 を追加します。

(知らない人のために:soundexは、文字列の音声表現(聞こえ方)を返す関数です)

データベースの構造: 1 つのテーブルsentencesに 2 つの行が含まれます:idsentence. 他のテーブルtagsにはid、(with は文の ID) とtag(with は文の 1 つの単語) が含まれています。 tagはただの言葉ではなく、この言葉の響きです。最後のテーブルにはandweightsが含まれています( is number を使用すると、 table にこのようなタグがいくつあるかがわかります)tagweighttags

私の質問は、指定された文字列に似た文を返す関数をどのように作成できるかです。タグ (単語の音声) を使用する必要があり、各タグはweightsテーブルに基づいて独自の権限を持つ必要があります。よく使われるタグほど重要であり、オリジナルタグよりも重要です。たった1つのmysqlクエリで実行できますか?

次の質問: このような類似文の検索方法は良いと思いますが、この機能の速度はどうですか? 私のサイトで非常に頻繁に使用する必要があります。

4

3 に答える 3

2

重みテーブルの代わりに、タグを文に関連付けるテーブルを用意しないのはなぜですか? したがって、sentence_tagsasentence_idtag_id列で呼び出されるテーブルがあります。次に、これら 2 つのテーブルを結合して重みを計算し、タグを含む文を参照することができます。タグとsoundexの両方をtagsテーブルに保存することもできます。

于 2011-03-23T21:15:02.583 に答える
0

おそらく、レーベンシュタイン距離が探しているものです。ある単語から別の単語に転送するために必要なステップ数を計算します。

これはコストのかかる操作であることを認識してください。

于 2011-03-23T21:29:50.237 に答える
0

Joe K の提案は、優れたデータベース設計に適しているようです。

外挿できる情報を保存しないでください。

つまり、結合ステートメントと PHP を使用して、実行時に重みを計算します。

これがあなたの設計における正しい解決策ではないかもしれないことは理解していますが、多くの場合、スマートなデータベース構造の設計に少し時間を費やすことで、すべてがうまく機能するようになります。

于 2011-03-24T00:13:00.580 に答える