web-dev-qa-db-ja.com

アクセントのない活用形(活用など)を備えたPostgres全文検索

Postgresで活用された(ポーランド語)言語でアクセントのないフレーズを検索できるようにしたい。

たとえば、ドキュメントにrobiłem、語彙素はrobić(無限大)。その形式はrobięrobiłrobiła 等々。たとえば、アクセント記号のないrobieというフレーズを使用して、それを見つけられるようにしたいrobię

私がしたことは、完全に機能する洗練されたテキスト検索設定から始めました

CREATE TEXT SEARCH DICTIONARY polish_ispell (
TEMPLATE = pg_catalog.ispell,
dictfile = 'polish', afffile = 'polish', stopwords = 'polish' );

次に、unaccentを含めるように拡張してみました。

create extension unaccent;
create text search configuration polish_unaccented (copy = polish);
ALTER TEXT SEARCH CONFIGURATION polish_unaccented   ALTER MAPPING FOR hword, 
hword_part, Word WITH unaccen, polish_ispell, simple, ;

残念ながら、この構成では字句が正しく作成されません。

select to_tsvector('polish_unaccented' ,'robił');

'robil':1

字句はもちろん次のとおりです。

'robić':1

したがって、以下はtrueを返すことができません(そしてそれが私が必要としていることです):

select to_tsvector('polish_unaccented','robić') @@ to_tsquery('polish_unaccented','robie');

私はググってみましたが、私のケースのために実際にPostgresを設定する方法を示すドキュメントが見つかりませんでした。ドキュメントは、「字句のある」単語ではない、不完全な「Hôtels」の例のみを示しています。

乾杯

4
Tomek

私の知る限り、一部の回避策はトリックに近いことを行う可能性がありますが、現在のPostgreSQLフルテキスト構成(辞書およびパーサー/レクサー)では希望どおりの操作を実行できません。

私はポーランド語を知りませんが、スペイン語で同様の問題があり(これも活用形などを持っています)、人々がGoogleができることに完全に夢中になっているという事実がありますアクセントを無視し、アクセントも無視することがよくあります。

辞書

PostgreSQL用のいくつかの辞書 を使用できます。これにより、さまざまなことを実行できますが、基本的にはテキストをいくつかの方法で単純化できます。単語を語彙素に変換する場合は、 ISpell辞書 を使用します。

[...] Wordの多くの異なる言語形式を同じ語彙素に正規化できます。たとえば、英語のIspell辞書は、検索用語bankのすべての格変化と活用形(たとえば、banking、banked、banks、bank's、およびbank's)に一致できます。

ただし、この辞書(少なくともスペイン語)は、適切にアクセントを付けた単語のみを認識するか、特定の(おそらくアクセントを付けた)単語がどのlexemeに対応するかを見つけることができません。これは、 ISpell辞書 のエントリ( Polish ISpell dictionary など)がすべて適切なアクセント(または発音区別符号)で記述されているためです(必要に応じて) 。

ISpell Polsih辞書は2つのファイルで構成され、1つはpl_PL.dic(私が推測できる限りISO-8859-2としてエンコードされています)とpl_PL.affです。最初のものはそれらに適用される語彙素+ルールを含み、2番目のものはそれらのルールの意味を含みます。 ISpellソフトウェアはこれらのファイルを解釈して、単語を語彙素に変換する方法を見つけ出します(また、スペルが正しいかどうかを確認する方法も)。

.dicファイルのエントリは次のようになります。

abecadło/UV
abecadłowy/bxXyY
[...]
Abisyńczyk/NOqsT
abisyński/XxYbyc

.affファイルは、「U」および「V」の意味と、/記号に続く以外のすべての文字のルールを提供します。このルール(私が知ることはあまりありません)によっては、Wordでサフィックスまたはプレフィックスがどのように機能するかをソフトウェアに伝えることができますabecadło。例えば:

SFX U   ło        le        [^astz]ło

この辞書にはabecadloabisynskiのような単語がないため、これらのテキストを検索に入力すると、辞書は語彙素を返しません。

可能な回避策:辞書ファイルを操作し、アクセント記号付きの文字を含むすべての行を、アクセント記号なしの同等のもので複製します。おそらく、辞書の.aff部分で同様のことを行う必要があります。

おそらく、 同義語辞書 を使用して、すべての単語のアクセント付きバージョンとアクセントなしバージョンを同じ意味にする必要があるでしょう。

これはブルートフォースアプローチであり、実際には、「アクセント付きの文字がアクセントのない対応物と同等であるポーランド語の新しいバージョン」を発明することになります。 [ディクショナリーの作成者に、人々が正しいスペル ;-)を確認するように指示しないでください。

このアプローチには非常に多くのリスクがあると思います。分音記号の有無によって単語の意味が根本的に変わる可能性があるので、スペイン語でもカタロニア語でもそれを行うことはないと思います(スペイン語では、 "año"は "ano"とはあまり関係ありません。類義語を考えるのは非常にデリケートです)。

これがポーランド語に当てはまるかどうかを評価する必要があります。


AlternativeSimple Dictionary と "filtering"の組み合わせを使用することができます unnacent module 。語彙素は取得されず、この組み合わせで実行できる変換はそれほど洗練されていません...しかし、abecadłoまたはabecadloを検索すると、同じ結果が得られます。

私の場合、私はこの解決策に落ち着きました。


2番目の選択肢:アクセントを無視する機能を備えたテキスト検索が必要な場合は、小さなスペルミスを考慮し、高度な可能性がたくさんあるので、 Apache Solr などのソリューションデータベース外。これは明らかに非常に異なるアプローチであり、データベースと同期させるにはいくつかのプロセスが必要です。

1
joanolo

うわー、楽しかったです。だから私はあなたのためにこれを行うプログラムを書きました pg_hunspell

pg_hunspell pl PL polish

SELECT to_tsvector('polish' ,'robił');
 to_tsvector 
-------------
 'robić':1
(1 row)
1
Evan Carroll