【问题标题】:Wordnet sqlite Synonyms and SamplesWordnet sqlite 同义词和示例
【发布时间】:2016-05-08 20:11:23
【问题描述】:

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

select senses.wordid, senses.synsetid, senses.sensekey, synsets.definition FROMsenses LEFT OUTER JOINsynsetsON senses.synsetid = synsets.synsetid where senses.wordid = 79459

我知道您可以通过将 synsetid 提交回 senses 表来获得同义词,该表会为您提供唯一的 wordid 和 sensekey,然后您可以将其与 words 表连接。我的问题是我似乎无法构建该查询。

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

wordid、lemma、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;

数据库链接:https://cloud.generatedesign.com/index.php/s/LA2G8ZvqNClqHFN

【问题讨论】:

  • 我知道什么是同义词,但什么是“样本”?
  • a sample is a sentence i.e 'Dog" -> "Dog is men's best friend." 这是示例数据库的链接。谢谢。cloud.generatedesign.com/index.php/s/Z152Je3JFaKEooI
  • 想想我对类似问题的回答here 可能会有所帮助。

标签: mysql sql sqlite android-sqlite wordnet


【解决方案1】:

我不确定我是否完全理解这个问题,但这样的事情不会起作用吗?

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 引用加入样本,但请记住,每个单词对和样本的结果都会重复;如果它们是具有多种含义的同义词,则可能会重复某些单词对。

【讨论】:

  • 我明白了。那不是问题。你能写完整的查询吗?添加字段名称时出现错误。
  • @YasinYaqoobi 我猜你在字段列表中使用了表名,而不是你需要别名;因为我不确定您需要哪些最终字段,所以我将使用您原始选择的等效项进行更新。
  • 我知道你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的“FROM senses AS s1 LEFT JOIN synsets ON s1.synsetid = synsets.synsetid LEFT”附近使用正确的语法
  • @YasinYaqoobi 你是想运行这个精确的查询,还是你自己的版本?尝试取出选择字段列表(& 评论),然后 SELECT * 看看是否可以解决它;也许我拼错了其中一个字段名称。 MySQL 往往会在它不理解的第一件事上指出错误,这意味着选择列表中的某些东西可能会出错,所以它当时并不期望 FROM 子句。
  • 是的,我正在运行确切的查询并尝试自己调试问题,但找不到导致问题的原因。还仔细检查了字段名称,它们似乎是正确的。我已将链接添加到实际的数据库文件。也许你可以在本地运行它? cloud.generatedesign.com/index.php/s/LA2G8ZvqNClqHFN
【解决方案2】:

架构发布后编辑

似乎senses 表捕获了每个单词及其所有同义词集之间的所有关系,应与inner joinwordssynsets 表一起使用以解开所有关系

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,因为您加入的字段似乎不能为空。

【讨论】:

  • 谢谢。我不得不从 synsetid 更改为 syn.synsetid 因为它抛出了一个错误。现在我得到了所有结果,除了引理实际上是重复的同一个词而不是同义词。
  • 如果您需要更多帮助,您会发布所有表的架构吗?
  • 已添加架构。只记得我也想在结果中包含“mantiq”。引理是单词,也可以是同义词,因为同义词只是一个单词。 Mantiq = 意义。
  • @yasinyaqoobi :如果这不能解决您的问题,请在表格中提供示例数据以及您的预期结果。
  • 感谢您的所有帮助。我希望你还有时间看看这个。一个星期后还是想不通。这是一个链接,您可以在其中下载示例数据。谢谢你。 cloud.generatedesign.com/index.php/s/Z152Je3JFaKEooI
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
相关资源
最近更新 更多