Wordnet sqlite 同义词和示例

Wordnet sqlite Synonyms and Samples

我正在尝试获取给定 wordid 的同义词和示例列表。经过大量的试验和错误后,我可以获得所有同义词集的样本,但不是实际的同义词。这是我的查询,它给出了以下结果。

select senses.wordid, senses.synsetid, senses.sensekey, synsets.definition FROM感觉 LEFT OUTER JOIN同义词ON senses.synsetid = synsets.synsetid where senses.wordid = 79459

我知道您可以通过将 synsetid 提交回感官 table 来获得同义词,这会为您提供唯一的 wordid 和 sensekey,然后您可以将它们与单词 table 连接起来。我的问题是我似乎无法构建该查询。

如果可能的话,我想获得这些专栏。如果不是 synsetid,引理和定义就可以了。当前数据库是 mySql 但我希望答案也适用于 sqlite,因为我将它用于 android 应用程序。

wordid、词条、senseid、synsetid、定义

架构:

CREATE TABLE `synsets` (
  `synsetid` int(10) unsigned NOT NULL DEFAULT '0',
  `pos` enum('n','v','a','r','s') NOT NULL,
  `definition` mediumtext,
  PRIMARY KEY (`synsetid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE `words` (
  `wordid` int(10) unsigned NOT NULL DEFAULT '0',
  `lemma` varchar(80) NOT NULL,
  `mantiq` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`wordid`),
  UNIQUE KEY `unq_words_lemma` (`lemma`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE `senses` (
  `wordid` int(10) unsigned NOT NULL DEFAULT '0',
  `synsetid` int(10) unsigned NOT NULL DEFAULT '0',
  `senseid` int(10) unsigned DEFAULT NULL,
  `sensekey` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`wordid`,`synsetid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `samples` (
  `synsetid` int(10) unsigned NOT NULL DEFAULT '0',
  `sampleid` smallint(5) unsigned NOT NULL DEFAULT '0',
  `sample` mediumtext NOT NULL,
  PRIMARY KEY (`synsetid`,`sampleid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Link 到数据库:https://cloud.generatedesign.com/index.php/s/LA2G8ZvqNClqHFN

模式发布后编辑

看来 senses table 捕获了每个单词及其所有同义词集之间的所有关系,应该与 inner join 以及 wordssynsets table 解开所有关系

select sen.wordid,
         w.lemma,
         w.mantiq,
       sen.senseid,
       sen.synsetid,
       syn.definition,
from senses sen 
inner join words w on sen.wordid = w.wordid
inner join synsets syn on sen.synsetid = syn.synsetid
order by sen.wordid, sen.synsetid;

您不需要 LEFT JOIN,因为您加入的字段似乎不可为空。

我不确定我是否完全理解这个问题,但这样的东西行不通吗?

SELECT s1.wordid, s1.synsetid, s1.sensekey, synsets.definition
   , s2.wordid AS matchedWordID, w.*  -- Additional info not from question's query
FROM senses AS s1
   LEFT JOIN synsets ON s1.synsetid = synsets.synsetid
   LEFT JOIN senses AS s2 ON s1.synsetid = s2.synsetid AND s1.wordid <> s2.wordid
   LEFT JOIN words AS w ON s2.wordid = w.wordid
WHERE s1.wordid = 79459
;

注意:... 只是您实际需要的字段列表的简写。

注#2:您当然可以使用 synsets 引用加入样本,但请记住,每个词对和样本的结果都会重复;如果某些词对是具有多种含义的同义词,则它们可能会重复。