2012-04-13 12 views
2

私は名前付きエンティティを持つ検索クエリを処理する必要のあるPython Webアプリケーションを作成しています。たとえば、検索クエリがある 場合:名前付きエンティティのPython自然言語処理

  • GoogleのAndroid: 「マックOSのライオン」 そして、私は私のデータベースで利用可能な候補者でこのクエリを処理しなければならないと言うことができます。
  • Microsoft Windows。
  • Apple社のMac OS Xのライオン
  • ...

我々は、すべての第三の結果が正しい結果であることを知っています。しかし、ユーザーのクエリ、つまり「Mac OS X Lion」を「Apple Mac OS X Lion」(私のデータベース上で利用可能なエントリ)にマッピングする方法はありますか。 誰かが何を探すか、何をするか教えてください。

答えて

2

ユーザークエリの正規化が必要で、正しい「クラス」へのマッピングを「学習」する必要があります。

簡単な方法は、「クラス」に一致する「トークン」の重なりを計算することです。次のサンプルコードが役立つことがあります。もちろん

classify_query('mac OS x') -> ['Apple Mac OS X Lion'] 
classify_query('Google') -> ['Google Android'] 

CLASSES = ['Google Android', 'Microsoft Windows', 'Apple Mac OS X Lion'] 

def classify_query(query_string): 
    """ 
    Computes the most "likely" class for the given query string. 

    First normalises the query to lower case, then computes the number of 
    overlapping tokens for each of the possible classes. 

    The class(es) with the highest overlap are returned as a list. 

    """ 
    query_tokens = query_string.lower().split() 
    class_tokens = [[x.lower() for x in c.split()] for c in CLASSES] 

    overlap = [0] * len(CLASSES) 
    for token in query_tokens: 
     for index in range(len(CLASSES)): 
      if token in class_tokens[index]: 
       overlap[index] += 1 

    sorted_overlap = [(count, index) for index, count in enumerate(overlap)] 
    sorted_overlap.sort() 
    sorted_overlap.reverse() 

    best_count = sorted_overlap[0][0] 

    best_classes = [] 
    for count, index in sorted_overlap: 
     if count == best_count: 
      best_classes.append(CLASSES[index]) 
     else: 
      break 

    return best_classes 

出力例は、これは非常に基本的なソリューションです。あなたは:)

+0

まあ私もウィキペディア上のいくつかの解決策を探していたのに役立ちますことを願っています

...クエリ文字列でのタイプミスの場合には、より堅牢であることを確認するいくつかのスペルを追加したい場合があります。そして私は最小限の編集距離で行えます。最小の編集距離は個々の文字に適用されます。私がやるべきことは、文字の代わりにトークンを使って同じ概念を適用することでした。途中であなたの答えをありがとう。 –

+0

たとえば、トークンの中に特定の量の「typo-ness」を許すために、文字列上のLevenshtein距離を使用できます。お力になれて、嬉しいです。私の答えを受け入れない理由は何ですか? – cfedermann

+1

実際には両方の答えが本当にとても役に立ちます。実際に私がDikeiの答えを見たとき、私はそれが私のプロジェクトにとってより適切であると感じました。しかし、私がここで尋ねたことは、あなたの答えはより適切です。だから私はあなたの答えを受け入れるべきだと思う。私は、複数回答を受け入れるための準備が必要だと思います。本当にありがとうございます。それはあなたにとってとても素敵でした。 –

1

類似のテキストを検索する必要がある場合は、Lucene + PyLuceneなどのPythonバインディングを使用したテキスト検索エンジンを使用できます。

関連する問題