我正在开发一个应用程序,用于为输入文本建议替代单词/短语。我对同义词表的优秀设计有疑问。
设计考虑因素:
football
有一个同义词(soccer
),但in particular
有两个(particularly
,specifically
)football
是soccer
的同义词,则该关系也存在相反的方向。我想到的是一个带有
的双栏设计col a = word
和col b = delimited list of synonyms
还有更好的选择吗?如何使用两个表,一个用于单词,另一个用于关系?
编辑:
在阅读答案后,我想到了另一种方法。它使用一个包含所有同义词的单列表,每个词包含在单词边界标记中。我的意思是像
|in particular|particularly|specifically|
然后我用
查询表格
SELECT * FROM synonyms WHERE word LIKE '%|specifically|%'
在代码中,我将前面和后面的|
废弃并进行拆分并使用同义词。
有什么不好的,我没看到?
答案 0 :(得分:4)
- col a = word和
- col b =定义的同义词列表
糟糕的主意。每次添加同义词时,都必须在两个位置进行更改。只需添加对
(in particular, particularly)
(in particular, specifically)
并在(a,b)
和a < b
中强制执行该操作。这样,就没有冗余。
使用两个表也很好,也许你会节省内存。但是,您还需要再加入一次查询。
答案 1 :(得分:2)
我会使用两个表的方法,一个用于单词,另一个用于单表方法的关系,原因有三个。
单词表:2列 ID , Word
关系表:2列 WordId1 , WordId2
具有两个同义词的单词将在Word表中有一行,在Relation表中有两行。
答案 2 :(得分:1)
你的一个表设计会有很多重复的同义词列表,但这对你来说可能没问题。
您可能需要考虑两个表设计,将所有单词映射到“规范变体”(作为单词)或id(数字):
syn1 -> 0x1234eef3
syn2 -> 0x1234eef3
然后将表映射到同义词列表:
01234eef3 -> (syn1, syn2)
答案 3 :(得分:-1)
在阅读答案之后,我想到了另一种方法。它使用一个包含所有同义词的单列表,每个词包含在单词边界标记中。我的意思是
|in particular|particularly|specifically|
然后我用
查询表格SELECT * FROM `synonyms` WHERE `word` LIKE '%|$word|%'
在代码中,我会废弃前面和后面的|
并执行explode
并使用同义词:
$synonyms = $row['word'];
$synonyms = explode('|', substr($synonyms, 1, -1));
unset($synonyms[$word]);