为聚类分析建立SQLite数据库

2024-04-20 08:26:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我对数据库完全陌生。我想得到一些关于如何设置和使用SQLite数据库进行集群分析和主题建模的建议。在

我有一个2GB文件,其中每一行都是一个json对象。以下是文件中的json对象示例:

{"body": "Heath Ledger's Joker...", "subreddit_id": "t5_2qh3s", "name": "t1_clpmhgo", "author": "l3thaln3ss", "created_utc": "1414799999", "subreddit": "movies", "parent_id": "t3_2kwdi3", "score": 1, "link_id": "t3_2kwdi3", "sub_type": "links - high"}

我创建了一个SQLite数据库,如下所示:

^{pr2}$

这是一个很好的数据库初始设置吗?在

我这样填充数据库:

import json
import sqlite3
import sys

def main(argv):
    if len(argv) != 2:
        sys.exit("Provide a comment file (of json objects) name.")

    fname = argv[1]

    db = sqlite3.connect("commentDB")
    columns = ['name', 'author', 'body', 'score', 'parent_id', 'link_id', 'subreddit', 'subreddit_id', 'sub_type', 'created_utc']

    query = "insert or ignore into Comments values (?,?,?,?,?,?,?,?,?,?)"

    c = db.cursor()

    with open(fname, 'r') as infile:
        for comment in infile:
            decodedComment = json.loads(comment)
            keys = ()
            for col in columns:
                keys += (decodedComment[col],)
            print str(keys)
            print
            c.execute(query, keys)

    c.close()
    db.commit()
    db.close()


if __name__ == "__main__":
    main(sys.argv)

最后,我将基于评论中共享的频繁词(用户在何处评论)以及通过分析subreddit评论中找到的单词获得的主题模型的差异,对subreddit进行聚类。请注意,我还有更多的2GB文件需要处理,所以理想的解决方案应该是相对可伸缩的。任何关于如何设置(特别是通过改进我所写的)数据库来完成这类工作的一般性建议都将不胜感激。在

谢谢!在

编辑:删除了关于插入性能的问题。在


Tags: 文件nameimportid数据库jsondbsqlite
2条回答

一些小的改进表明了它们自己,例如,CommentsCREATE TABLE有一个references Comment(name),我很确定{}是拼写错误,你的意思是{}(所以你发布的代码不能工作)。在

从速度上讲,将特殊命名为keys构建为tuple有点浪费list会更好,即替换

        keys = ()
        for col in columns:
            keys += (decodedComment[col],)

^{pr2}$

为了获得更好的性能(也许还没有清楚地记录,但是游标的execute方法使用第二个参数,它是一个列表,就像它使用一个元组一样令人愉快)。在

但是总的来说,你有一个很好的开始,在摄取一个2GB的输入文件后应该会很好。然而,sqlite虽然在很多方面都很出色,但对于那些需要“真正”数据库的规模来说,它的规模并不是很好。{{12}和非商业的{cdi}可能也很好。在

如果你所说的“更多”(2GB文件)是指成百上千,甚至是“严肃”的专业数据库可能在某个时候开始吱吱作响,这取决于具体的处理方式,确切地说,你打算扔掉它们;提到“评论中的每一个单词”(这意味着我认为body字段需要进行词干处理&;在一个有点令人担忧的词的收集中。在

一旦这成为一个问题,“NoSQL”产品,或者那些需要扩展的东西,比如BigQuery,可能是值得的。但是,对于小规模的实验,您肯定可以从sqlite开始,并使用它来开发您心目中的“集群”算法;然后扩展到PostgreSQL或其他工具,以检查这些中等规模的扩展是如何工作的;只有在需要时,才需要额外的工作来考虑非关系解决方案,这,虽然非常强大,但往往需要对某些访问模式进行承诺(关系数据库,最需要的是添加索引,可能更适合于更具实验性的舞台剧!)。在

传统的SQL和NoSQL数据库对于这种分析并不是特别有用。缺乏允许精细获得相似性的能力,或根据需要通过聚类算法加速查询的能力。在

在大多数实际应用中,您将得到这样一个工作流:

  1. 将数据库中的数据加载到分析应用程序中(通常通过将其转储为某种CSV格式)
  2. 进行分析
  3. 将结果写回数据库

这不是很漂亮也不是很有效,肯定会让你失望。但考虑到即使在商业报价中也缺乏分析灵活性,这就是我们所能得到的。甚至一些商业产品中提供的分析功能(其中有足够的功能)通常都是这样工作的。在

在您的特定用例中,可以使用Lucene作为后台数据库。如果您有一个集群算法实现,可以通过Lucene查询来加速,也就是说。在

相关问题 更多 >