我有一个synonyms table
称为syns来存储单词和现有同义词。以同样的方式,还有另一个表叫做subs,其中包含word substitutions
一个单词。这些表用于在称为主表的institutions
主机中查找相似的值,该主表托管数据库中的现有名称。
这样做的目的是避免考虑同义词和单词替换的相似名称。用户提供了一个新的机构名称,在插入机构表之前,有多个查询用同义词和单词替换来替换每个单词。例如,我有以下数据:
substitution word table:
WORD SUBS_LIST
MOUNTAIN MOUNTAIN, MOUNT, MT, MTN
VIEW VIEW, VU
FORMULA FORMULA, 4MULA
Synonym list table:
WORD SYN_LIST
EDUCATION SCHOOL, UNIVERSITY, COLLEGE, TRAINING
institutions table:
NAME
FORMULA VIEW UNIVERSITY
FOURMULAE VULCAN COLLEGE
4MULA VU CAFE
机构表包含数据库中所有现有的名称。然后,当接收到新名称时,用每个单词的相应同义词列表和单词替换来替换单词时,不必一定要相似。例如,FORMULA VU SCHOOL
由于现有record ,应该在数据库中找到一个新名称,例如FORMULA VIEW UNIVERSITY
。
我创建了这个小提琴来展示这个想法。但是,我没有得到任何结果。
谢谢
下面的功能似乎正在工作。它使用将逗号分隔的字符串之一拆分为单词的技术,也可以应用其他字符串。但是最好的办法是将数据模型更改为单个单词同义词,这样可以避免拆分,这可能是不可靠的。您可以在检查新条目时使用此功能,例如:
where replace_synonyms(inserted_value) <> replace_synonyms(existing_value)
测试:
select replace_synonyms('FORMULA VIEW UNIVERSITY') from dual;
-- FORMULA VIEW EDUCATION
select replace_synonyms('CANTINA TRAINING MT') from dual;
-- FOOD EDUCATION MOUNTAIN
功能:
create or replace function replace_synonyms(i_text in varchar2) return varchar2
is
p_text varchar2(4000) := i_text;
cursor c_subs is
select word, trim(column_value) text
from subs, xmltable(('"' ||replace(subs_list, ',', '","') || '"'))
where p_text like '%'||trim(column_value)||'%'
union
select word, trim(column_value) text
from syns, xmltable(('"' ||replace(syn_list, ',', '","') || '"'))
where p_text like '%'||trim(column_value)||'%';
begin
for i in c_subs
loop
p_text := regexp_replace(
p_text, '(^|[^a-z0-9])' || i.text || '($|[^a-z0-9])',
'\1' || i.word || '\2', 1, 0, 'i');
end loop;
return p_text;
end;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句