同义词表的替代设计?

时间:2010-05-27 02:12:25

标签: database-design

我正在开发一个应用程序,用于为输入文本建议替代单词/短语。我对同义词表的优秀设计有疑问。

设计考虑因素:

  1. 同义词的数量是可变的,即football有一个同义词(soccer),但in particular有两个(particularlyspecifically
  2. 如果footballsoccer的同义词,则该关系也存在相反的方向。
  3. 我们的目标是查询单词并找到其同义词
  4. 我们希望保持桌面小,并且轻松添加新单词
  5. 我想到的是一个带有

    的双栏设计
    • col a = word
    • col b = delimited list of synonyms

    还有更好的选择吗?如何使用两个表,一个用于单词,另一个用于关系?

    编辑:
    在阅读答案后,我想到了另一种方法。它使用一个包含所有同义词的单列表,每个词包含在单词边界标记中。我的意思是像 |in particular|particularly|specifically|
    然后我用
    查询表格 SELECT * FROM synonyms WHERE word LIKE '%|specifically|%'
    在代码中,我将前面和后面的|废弃并进行拆分并使用同义词。

    有什么不好的,我没看到?

4 个答案:

答案 0 :(得分:4)

  
      
  • col a = word和
  •   
  • col b =定义的同义词列表
  •   

糟糕的主意。每次添加同义词时,都必须在两个位置进行更改。只需添加对

(in particular, particularly)
(in particular, specifically)

并在(a,b)a < b中强制执行该操作。这样,就没有冗余。

使用两个表也很好,也许你会节省内存。但是,您还需要再加入一次查询。

答案 1 :(得分:2)

我会使用两个表的方法,一个用于单词,另一个用于单表方法的关系,原因有三个。

  1. 单词表中没有重复的单词。
  2. 执行单词及其同义词之间的双向关系更容易。
  3. 编写适用于分隔列表的SQL语句会更加繁琐。
  4. 单词表: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]);