高效的查询来查找与基于多行的规则匹配的行

时间:2020-04-05 16:29:56

标签: sql postgresql nlp relational-division

我有一个捷克语单词(> 1M行)的PostgreSQL表,其列名为“单词” [text],我想根据单词结尾查找所有具有相同偏角的单词(请参见Czech declination

例如我想找到所有以“ e”结尾的单词(例如kuře),但是对于所有以“ ete”(例如kuřete),“ etem”(例如kuřetem)和“ eti”(例如ete)结尾的词形kuřeti)。对于每个单词,大约存在。 14个字词形式。

找到所有符合规则的单词的有效方法(SQL查询)是什么?

2 个答案:

答案 0 :(得分:2)

这是关系划分的情况。

假设一个UNIQUE个单词的表如下:

CREATE TABLE words (word text PRIMARY KEY);

这应该是最快的解决方案之一:

SELECT w0.stem
FROM  (
   SELECT left(word, -4) AS stem  -- -4 = length('etem')
   FROM   words
   WHERE  word LIKE '%etem'  -- pick the most selective ending to get started
   ) w0
JOIN   words w1 ON w1.word = stem || 'eti'
JOIN   words w2 ON w2.word = stem || 'ete'
JOIN   words w3 ON w3.word = stem || 'e';

查找出现在所有给定结尾处的所有词干。以相同词干和不同结尾的更多单词不会取消资格!

如果您必须检查许多结尾(14?),则将其全部拼写可能很乏味。代码较短,通常较慢:

SELECT w0.stem
FROM  (
   SELECT left(word, -4) AS stem
   FROM   words
   WHERE  word LIKE '%etem'  -- pick the most selective ending to get started
   ) w0
CROSS  JOIN unnest ('{eti,ete,e}'::text[]) x(dec)  -- all other in an array
JOIN   words w1 ON w1.word = w0.stem || x.dec
GROUP  BY w0.stem
HAVING count(*) = 3;  -- = cardinality('{eti,ete,e}'::text[])

db <>提琴here

相关:

Text search运算符和索引可能是您感兴趣的。但是,您首先需要捷克词干,但标准Postgres发行版中未包含该词干。相关:

答案 1 :(得分:0)

嗯。 。 。如果我理解正确,那么操作就没有效率。但是我认为,除非您采用神秘的索引策略(即使那样也可能不起作用),否则聚合可能是最快的方法:

LogisticRegression(multi_class='multinomial')
OneVsOneClassifier(LogisticRegression())
OneVsRestClassifier(LogisticRegression())