【问题标题】:key word/phrase search against similarity Matrix in SQLiteSQLite中针对相似度矩阵的关键字/短语搜索
【发布时间】:2013-05-17 20:42:45
【问题描述】:

我有一个带有架构的文档表:

CREATE TABLE Frequency (
  docid VARCHAR(255),
  term VARCHAR(255),
  count int,
PRIMARY KEY(docid, term));

要查找我将使用的所有文档的相似度原始分数:

SELECT a.term, b.term, sum(a.count * b.count) 
FROM Frequency a, Frequency b
Where a.term = b.term

我不确定为什么会这样,但它确实在测试数据上做了 D*DT,其中 DT 是 D 的转置。

我现在需要计算诸如“国会枪法”之类的术语的查询/文本字符串相似度

我相信这涉及联合和分组,但我所有的查询尝试都失败了,例如:

SELECT *
FROM Frequency a, Frequency b, Frequency c
Where a.term = b.term 
UNION
SELECT  a.docid, 'congress' as term, 1 as count 
UNION
SELECT  b.docid , 'gun' as term, 1 as count
UNION 
SELECT  c.docid , 'laws' as term, 1 as count 
Group by docid;

我是这种 SQL 的新手,希望能在我试图理解的过程中进行叙述 我也在做什么。

请解释为什么第一个查询有效以及如何处理第二个查询。

【问题讨论】:

  • 这种情况下“相似度”如何定义?
  • 计数列列出了一个术语单个术语的并发数,例如“congress”。
  • 所以对于一个术语来说,这将是 doument
  • 我需要对一串术语“congress+ gun +laws”进行相似性分析,并希望确定这些术语的原始计数,例如输出行:of docid "A term Congress term gun term law count 5 5
  • 没有人知道你想要什么。显示一些示例记录和所需的结果。

标签: sql sqlite similarity keyword-search


【解决方案1】:

简单地说,我们在这里真正想做的就是将新的元组添加到表中,然后使用您上面提到的矩阵转置操作将这个新表与旧表进行比较。您需要“标记”这些新关键字,以便您可以将它们用作查询中的条件。所以这个

SELECT b.docid, b.term, SUM(a.count * b.count) 
FROM (SELECT * FROM Frequency
      UNION
      SELECT  'q' as docid, 'congress' as term, 1 as count 
      UNION
      SELECT  'q' as docid, 'gun' as term, 1 as count
      UNION 
      SELECT  'q' as docid, 'laws' as term, 1 as count 
     ) a, Frequency b
WHERE a.term = b.term 
AND a.docid = 'q'
GROUP BY b.docid, b.term
ORDER BY SUM(a.count * b.count);

将为您提供包含该术语及其各自相似度分数的 docid 列表。

【讨论】:

  • 非常感谢!发现!克里斯
  • 这在 python 脚本中不起作用,它运行无限长。导入 sqlite3;路透社=sqlite3.connect('reuters.db'); c = reuters.cursor(); p=c.execute(~~ sql 脚本 ~~); c.fetechall();
【解决方案2】:

你的问题和cmets是不可理解的。

但以下查询显示了包含所有三个词条的所有文档中三个词条的出现次数:

SELECT a.docid,
       a.count,
       b.count,
       c.count
FROM Frequency AS a
JOIN Frequency AS b ON a.docid = b.docid
JOIN Frequency AS c ON b.docid = c.docid
WHERE a.term = 'congress'
  AND b.term = 'gun'
  AND c.term = 'laws'

【讨论】:

  • 此代码返回结果,但不限制文档包含所有三个术语,例如,docid "AA" 术语 congress、gun、laws:SELECT a.docid、a.term、a.count FROM加入频率(SELECT 'q' as docid, 'washington' as term, 1 as count UNION SELECT 'q' as docid, 'taxes' as term, 1 as count UNION SELECT 'q' as docid, 'treasury' as term , 1 作为计数)b ON a.term = b.term WHERE a.term = 'washington' OR a.term = 'taxes' OR a.term ='treasury' GROUP BY a.docid, a.term;请有任何建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 2014-01-25
相关资源
最近更新 更多