代码之家  ›  专栏  ›  技术社区  ›  Majid Fouladpour

同义词表的替代设计?

  •  1
  • Majid Fouladpour  · 技术社区  · 15 年前

    我正在开发一个应用程序,为输入文本提供备选单词/短语建议。我怀疑什么是同义词表的好设计。

    设计注意事项:

    1. 同义词的数量是可变的,即 football 有一个同义词( soccer ) in particular 有两个( particularly , specifically )
    2. 如果 足球 是同义词 足球 关系也存在于相反的方向。
    3. 我们的目标是查询一个词并找到它的同义词
    4. 我们想把桌子放小,让添加新单词变得容易

    我想到的是两栏式设计

    • col a = word
    • col b = delimited list of synonyms

    还有更好的选择吗?用两张表怎么样,一张是单词表,另一张是关系表?

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

    有什么不好的地方,我看不见?

    4 回复  |  直到 13 年前
        1
  •  4
  •   Artefacto    15 年前
    • A栏=单词和
    • B列=同义词分隔列表

    糟糕的主意。每次添加同义词时,必须在两个地方更改它。只添加对

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

    并在 (a,b) a < b . 这样,就不会有冗余。

    使用两张表也很好,也许可以节省内存。但是,您将在查询中再加入一个join。

        2
  •  2
  •   anonymous    15 年前

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

    1. 单词表中没有重复单词。
    2. 在一个词和它的同义词之间加强双向关系更容易。
    3. 编写用于分隔列表的SQL语句更为繁琐。

    单词表:2列 身份证件 ,

    关系表:2列 Word1 , Word2

    具有两个Synomyms的单词将在单词表中有一行,在关系表中有两行。

        3
  •  1
  •   Stephen    15 年前

    您的单表设计会有很多重复的同义词列表,但这对您来说可能很好。

    您可能需要考虑双表设计,将所有单词映射为“规范变体”(作为单词)或ID(数字):

    syn1 -> 0x1234eef3
    syn2 -> 0x1234eef3
    

    然后,表将ID映射到同义词列表:

    01234eef3 -> (syn1, syn2)
    
        4
  •  -1
  •   Majid Fouladpour    13 年前

    读完答案后,我想到了另一种方法。它使用一个包含所有同义词的单列表,每个同义词都包含在单词边界标记中。我的意思是

    |in particular|particularly|specifically|

    然后我会用

    SELECT * FROM `synonyms` WHERE `word` LIKE '%|$word|%'
    

    在代码中我把前面和后面 | 做一个 explode 并有同义词:

    $synonyms = $row['word'];
    $synonyms = explode('|', substr($synonyms, 1, -1));
    unset($synonyms[$word]);