我有一个捷克语单词(> 1M行)的PostgreSQL表,其列名为“单词” [text],我想根据单词结尾查找所有具有相同偏角的单词(请参见Czech declination)
例如我想找到所有以“ e”结尾的单词(例如kuře),但是对于所有以“ ete”(例如kuřete),“ etem”(例如kuřetem)和“ eti”(例如ete)结尾的词形kuřeti)。对于每个单词,大约存在。 14个字词形式。
找到所有符合规则的单词的有效方法(SQL查询)是什么?
答案 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())