0

私は問題を抱えています。些細なことに聞こえるだけでなく、(私にとって)簡単でスケーラブルでパフォーマンスの高いソリューションを見つけるのは簡単ではありません。ウェブサイトのユーザーが場所を検索できる入力テキストが 1 つあります。

現在、場所は都市、都市の住所、または都市の近隣であり、ユーザーはカンマを使用して都市から住所または近隣を区切る必要があります。その後、文字列を分割して、最初のブロックは、住所、近隣または都市です。ユーザーが入力に必要なすべての情報を入力するのに失敗し、都市なしで住所を入力し、同じ名前の複数の通りに一致した場合、正しい場所を選択できるようにすべての場所を表示します。

検索ログを使用すると、すべてのツール ヒントで場所検索の使用方法が示されていても、ほとんどのユーザーがコンマを使用していないことがわかります (thx google :p)。

そのため、次のようなカンマで区切られていないアドレスを受け入れるために、ロケーション検索の新しい要件が必要です。

1. "5th Avenue"
2. "Manhattan"
3. "New York"
4. "5th Avenue Manhattan"
5. "5th Avenue Manhattan New York"
6. "Manhattan New York"
7. "5th Avenue New York"

しかし、各ブロックの意味を見つける方法や、これを機能させる動的な方法を見つけることができません。つまり、"New Yok" のような文字列を取得した場合、"new" は住所、"york" は都市になります。

私の質問は、私が必要とするものを達成するためのある種のテクニックまたはフレームワークがありますか、それとも具体的にそれを行うために (単語数、コンマなどに基づいて) アルゴリズムで自分のやり方で作業する必要がありますか?

編集1:

私はSQL Serverを使用しているため、全文検索の複数列検索を考えており、前に完全一致を行い、後で完全一致ではありません。しかし、一部の不完全なアドレスは数千行を返すと思います。

4

1 に答える 1

1

左から右に特異性が低下することが鍵ではないでしょうか。つまり、一番右のセマンティック要素 (「ニューヨーク」でも「マンハッタン」でも) は常に最も具体的ではありません (それが区の場合、市について心配する必要はありません。ボローなどを心配する必要はありません。)

したがって、トークンを逆にして再帰的に検索し、完全なヒット (「Manhattan」) またはセマンティック要素の開始または終了を示すキーワード (「Avenue」、「Street」、「New」) を探します。したがって、パスの後、次のようになる可能性があります。

"5th Avenue" -> TOKEN STREET_END_TOKEN
"Manhattan" -> BOROUGH
"New York" -> COMPOUND_BEGIN_TOKEN TOKEN
"5th Avenue Manhattan" -> TOKEN STREET_END_TOKEN BOROUGH
"5th Avenue Manhattan New York" -> TOKEN STREET_END_TOKEN BOROUGH COMPOUND_BEGIN_TOKEN TOKEN
"Manhattan New York" -> BOROUGH COMPOUND_BEGIN_TOKEN TOKEN
"5th Avenue New York" -> TOKEN STREET_END_TOKEN COMPOUND_BEGIN_TOKEN TOKEN

これは、パターン マッチに十分な情報を提供するはずです。

アップデート:

OK、一般的な戦略を拡張するには:

Step 1 : Generate a pattern of the query structure by identifying keywords ("Manhattan"), and semantically-meaningful ("Street", "Avenue") or grammatically-significant ("New", "Saint") tokens. 
Step 2: Match the generated pattern against a set of templates -- "* BOROUGH *" -> (Street) (BOROUGH) (City)", "* STREET_END_TOKEN" -> (Street name) (Street type), etc.  
Step 3: The result of Step 2 ought to give you a sense of what kind of query you're dealing with. You'll have to apply domain rules at that point (if you know the complete query is TOKEN STREET_END_TOKEN then you know "Well, this is a query that just specifies a street" and you have to apply whatever rule is appropriate (grab the locale of their browser? Use their query history to guess which neighborhood and city? etc.) 
于 2012-06-01T18:40:18.210 に答える