您可以使用对象类型和集合为每个单词创建一个同义词列表,然后创建一个用户定义的函数来处理替换:
Oracle 设置:
CREATE TYPE wordlist IS TABLE OF VARCHAR2(30);
CREATE TYPE word_synonyms IS OBJECT(
word VARCHAR2(30),
synonyms wordlist
);
CREATE TYPE word_synonyms_list IS TABLE OF word_synonyms;
CREATE FUNCTION replace_synonyms(
text IN VARCHAR2,
synonym_list IN word_synonyms_list
) RETURN VARCHAR2 DETERMINISTIC
IS
p_text VARCHAR2(4000) := text;
BEGIN
FOR i IN 1 .. synonym_list.COUNT LOOP
FOR j IN 1 .. synonym_list(i).synonyms.COUNT LOOP
p_text := REGEXP_REPLACE(
p_text,
'(^|[^a-z0-9])' || synonym_list(i).synonyms(j) || '($|[^a-z0-9])',
'\1' || synonym_list(i).word || '\2',
1,
0,
'i'
);
-- Handle repeated synonyms.
p_text := REGEXP_REPLACE(
p_text,
'(^|[^a-z0-9])' || synonym_list(i).synonyms(j) || '($|[^a-z0-9])',
'\1' || synonym_list(i).word || '\2',
1,
0,
'i'
);
END LOOP;
END LOOP;
RETURN p_text;
END;
/
测试数据:
CREATE TABLE test_data ( text ) AS
SELECT 'FORMULA VIEW UNIVERSITY' FROM DUAL UNION ALL
SELECT '4MULA VIEW UNIVERSITY' FROM DUAL UNION ALL
SELECT 'FOURMULA VIEW UNIVERSITY' FROM DUAL UNION ALL
SELECT 'FORMULA VU UNIVERSITY' FROM DUAL UNION ALL
SELECT '4MULA VU UNIVERSITY' FROM DUAL UNION ALL
SELECT 'FOURMULA VU UNIVERSITY' FROM DUAL UNION ALL
SELECT 'FOURMULA VU SCHOOL' FROM DUAL UNION ALL
SELECT 'FOURMULAE VULCAN SCHOOLING' FROM DUAL;
查询:
SELECT text,
replace_synonyms(
text,
word_synonyms_list(
word_synonyms( '4MULA', wordlist( 'formula', 'fourmula' ) ),
word_synonyms( 'VIEW', wordlist( 'vu' ) ),
word_synonyms( 'UNIVERSITY', wordlist( 'school' ) )
)
) AS substitutions
FROM test_data
输出:
正文 |替代品
:------------------------- | :-------------
公式查看大学 | 4MULA 查看大学
4MULA 视图大学 | 4MULA 查看大学
FOURMULA VIEW 大学 | 4MULA 查看大学
似曾相识大学 | 4MULA 查看大学
4MULA VU 大学 | 4MULA 查看大学
FOURMULA VU 大学 | 4MULA 查看大学
FOURMULA VU 学校 | 4MULA 查看大学
FOURMULAE VULCAN 学校 | FOURMULAE VULCAN 学校
和:
SELECT text
FROM test_data
WHERE replace_synonyms(
text,
word_synonyms_list(
word_synonyms( '4MULA', wordlist( 'formula', 'fourmula' ) ),
word_synonyms( 'VIEW', wordlist( 'vu' ) ),
word_synonyms( 'UNIVERSITY', wordlist( 'school' ) )
)
)
LIKE '%4MULA VIEW%%UNIVERSITY%'
输出:
|正文 |
| :------------------------ |
|公式查看大学 |
| 4MULA 视图大学 |
| FOURMULA VIEW 大学 |
|似曾相识大学 |
| 4MULA VU 大学 |
| FOURMULA VU 大学 |
| FOURMULA VU 学校 |
db小提琴here
目前,在 test_data 表中,我只有一条记录,例如 FORMULA VIEW UNIVERSITY。此外,我有一个单词替换表和同义词表,与您所包含的方式非常相似。考虑到我只有 FORMULA VIEW UNIVERSITY 的记录,我怎么能调用 replace_synonyms,例如:SELECT text FROM test_data WHERE replace_synonyms(...)) LIKE '%4MULA VU%%UNIVERSITY%'。请注意,通常我会想比较一个不在 test_data 中的新名称,例如 '%4MULA VU%%UNIVERSITY%'
交换它以使同义词在LIKE 过滤器中标准化,而不是在表中的文本中:
CREATE TABLE test_data ( text ) AS
SELECT 'FORMULA VIEW UNIVERSITY' FROM DUAL;
然后:
SELECT text
FROM test_data
WHERE text LIKE replace_synonyms(
'%4MULA VU%%SCHOOL%',
word_synonyms_list(
word_synonyms( 'FORMULA', wordlist( '4mula', 'fourmula' ) ),
word_synonyms( 'VIEW', wordlist( 'vu' ) ),
word_synonyms( 'UNIVERSITY', wordlist( 'school' ) )
)
)
输出:
|正文 |
| :------------------------ |
|公式查看大学 |
db小提琴here