我希望在非常大量的文档上跟踪主题的受欢迎程度。此外,我希望根据主题向用户提供推荐,而不是通常的词袋模型。为了提取主题,我使用了自然语言处理技术,这超出了本文的范围。
我的问题是,我应该如何持久化这些数据,以便: I)我可以快速获取每个主题的趋势数据(原则上,每次用户打开文档时,该文档中的主题应该会增加) II)我可以快速比较文档以提供推荐(这里我正在考虑使用聚类技术)
更具体地说,我的问题是: 1)我应该使用通常的方式来存储文本挖掘数据吗?这意味着为每个文档存储一个主题出现向量,这样我以后就可以测量不同文档之间的欧几里得距离。2)其他方式?
我正在寻找特定的python方法来做到这一点。我研究了SQL和NoSQL数据库,也研究了pytables和h5py,但我不确定如何实现这样的系统。我关心的一个问题是,我如何处理不断增长的主题词汇表?
非常感谢
发布于 2012-06-30 06:47:31
我建议您在SQL数据库中完成这项工作。您可能不想将文档存储在那里,但是主题是合适的。
您需要一个仅用于主题的表:
create table Topics (
TopicId int identity(1,1), -- SQL Server for auto increment column
TopicName varchar(255),
CreatedBy varchar(255) default system_user,
CreatedAt datetime default getdate())
您希望为分配给文档的主题创建另一个表,假设您有某种类型的文档id来标识文档:
create table DocumentTopics (
DocumentTopicId int identity(1,1), -- SQL Server for auto increment column
TopicId int,
DocumentID int,
CreatedBy varchar(255) default system_user,
CreatedAt datetime default getdate())
和另一个用于文档视图的表:
create table DocumentView (
DocumentViewId int identity(1,1), -- SQL Server for auto increment column
DocumentId int,
ViewedAt datetime,
viewedBy int, -- some sort of user id
CreatedBy varchar(255) default system_user,
CreatedAt datetime default getdate())
现在,您可以使用如下查询获取给定日期范围内的受欢迎程度的主题:
select t.TopicId, t.TopicName, count(*) as cnt
from DocumentUsage du join
DocumentTopics dt
on du.DocumentId = dt.DocumentId join
Topics t
on dt.TopicsId = t.TopicsId
where du.ViewedAt between <date1> and <date2>
group by t.TopicId, t.TopicName
order by 3 desc您还可以获取有关用户的信息、随时间变化的信息以及其他信息。您可以有一个用户表,它可以为主题(更可靠的用户,不太可靠的用户)提供权重。系统的这一方面应该在SQL中完成。
发布于 2012-06-30 02:48:07
为什么不使用简单的SQL表
表:
主键为id或文件名的
您提到的数组方法似乎是获得术语的一种缓慢方法。使用sql,您可以轻松地允许将新的术语添加到观察表中。
如果documents表包含时间戳,则可以通过按日期聚合来轻松聚合,甚至可以执行热门内容。
https://stackoverflow.com/questions/11267143
复制相似问题