1

私の問題を説明しましょう。入力文字列と何千もの文字列を含む表があります。私は入力文字列に最も類似した*文字列を検索する最良の方法を探しています。検索では、10個の推奨文字列を類似度でソートしたリストが返されます。文字列には、データベース内の他の列に数値的な重み(人気度)が関連付けられているため、可能な場合は、重みの高いものが結果に表示される可能性が高くなります。データベース内の(類似した)文字列を検索するスケーラブルな方法

これを達成するための最良のライブラリは何ですか?私は、Elasticsearchに似た何かを探しています。私はこれらの種類のライブラリで多くの経験を持っていないので、プロジェクトや好ましくはオープンソースに含めるのは簡単なものが必要です。私はPython(FlaskとSQLAlchemy)とPostgreSQLを使用していますが、例えば、必要に応じてNode.js。

*私はまた、私が探している類似性の種類を明確にしたいと思います。理想的には、それは意味的類似性であるが、語彙的類似性も良好である。私は大丈夫で、実装が簡単で、可能な限りスケーラブルでパフォーマンスの高いものに満足しています。

例の入力文:

  • 私はcangaroosが好きではありません。データベースから

例提案:

  • Cangaroos私の好みではありません。
  • カンガルーは邪悪です。
  • 私はかつてカガルーを食べました。もう一度。

「cangaroo」はデータベースで頻繁に使用される単語ではないため、「cangaroo」という単語を含む文字列はすべて結果に表示される可能性が高いからです。おそらく「好きではない」を検出するのはずっと難しく、その部分は完全にオプションです。

p.s. PostgreSQLの全文検索でこのようなことができますか?

ありがとうございます。

答えて

3

PostgreSQL全文検索では、探しているものを実行できません。ただし、PostgreSQL trigram similarityできます。

あなたデータベース内の(1回)実行することで、「トライグラムの類似性」と「btree_gistに関する複数の」でパッケージをインストールしておく必要があります:

CREATE EXTENSION pg_trgm; 
CREATE EXTENSION btree_gist; 

私はあなたがこのいずれかのように見える一つのテーブルを持っていると仮定します。

CREATE TABLE sentences 
(
    sentence_id integer PRIMARY KEY, 
    sentence text 
) ; 

INSERT INTO sentences (sentence_id, sentence) 
VALUES 
    (1, 'Cangaroos are not my favorite.'), 
    (2, 'A vegetable sentence.'), 
    (3, 'Cangaroos are evil.'), 
    (4, 'Again, some plants in my garden.'), 
    (5, 'I once had a cangaroo. Never again.') ; 

このテーブルには、PostgreSQLデータベースに「類似性によるインデックス作成」を許可するための「trigramインデックス」が必要です。あなたが実行し、

を、あなたが探している答えを見つけるために:これは、実行することによって達成される

-- Set the minimum similarity you want to be able to search 
SELECT set_limit(0.2) ; 

-- And now, select the sentences 'similar' to the input one 
SELECT 
    similarity(sentence, 'I don''t like cangaroos') AS similarity, 
    sentence_id, 
    sentence 
FROM 
    sentences 
WHERE 
    /* That's how you choose your sentences: 
     % means 'similar to', in the trigram sense */ 
    sentence % 'I don''t like cangaroos' 
ORDER BY 
    similarity DESC ; 

あなたが得る結果は次のとおりです。これは与え

similarity | sentence_id | sentence 
-----------+-------------+------------------------------------- 
    0.3125 |   3 | Cangaroos are evil.  
    0.2325 |   1 | Cangaroos are not my favorite. 
    0.2173 |   5 | I once had a cangaroo. Never again. 

・ホープあなたが望むもの...

+0

Joanolo、ありがとう、完璧に働いた! – Ognjen

+0

Flask-SQLAlchemyでこれを行う必要がある人は、私に知らせてください。私は自分のコードを投稿します。 – Ognjen

関連する問題