2011-09-21 51 views
4

我正在构建一个大约有10,000条记录的MySQL数据库。每个记录将包含一个文本文档(大多数情况下为几页文本)。我想在整个数据库中进行各种n-gram计数。我有已经用Python编写的算法,这些算法是我想要对付包含大量文本文件的目录,但要做到这一点,我需要从数据库中提取10,000个文本文件 - 这会产生性能问题。MySQL中的n元计数

我是一个使用MySQL的新手,所以我不确定它是否有任何内置功能可以执行n-gram分析,或者是否有很好的插件。请注意,在我的分析中,我需要至少达到4克(最好是5克),所以我看到的简单的2克插件在这里不起作用。在进行n-gram计数之前,我还需要能够从文本文档中删除停用词。

社区的任何想法?

感谢,

罗恩

+0

当没有人正在等待答案时,你不是在离线处理n-gram吗?或者是否需要在每次添加一批文件时跨越许多文本文件快速生成新的n-gram数据库? – hobs

+0

我知道类似于在其他论坛中询问的问题。在放弃和寻找一些应用程序级别的解决方案(例如PHP)来执行字符串分析之前,问题人员在SQL中摆弄了几天。只是说' – Strawberry

+0

你不能在RDBMS中进行合理的5克处理。如果你缺乏递归查询的能力,Storarge是可行的,但是非常痛苦。 (在这方面,mysql是个不错的选择)我自己的玩具项目http://sourceforge.net/projects/wakkerbot/拥有所有原始文本行(大约2M当前)存在于(postgres)数据库中,但是它全部都是在独立的C程序中进行5克马尔可夫处理,将其树(35M节点)存储在平面文件中。恕我直言,Python对于这种事情来说太慢了。 – wildplasser

回答

1

我的建议是使用像Lucene的/ Solr的,它具有更丰富和这样的事情可扩展支持专用的全文搜索索引程序。它需要你学习一点才能设置它,但听起来好像你想要在MySQL中难以定制的级别混乱。

0

如果你真的想过早优化;)你可以translate your python into C,然后用薄mysql UDF wrapper code包装它。

但我强烈建议每次只加载一个文档并在其上运行你的Python脚本来填充一个n-gram的mysql表。我现在每个钉子的锤子都是Django。它是ORM与mysql表进行交互并优化这些交互。我使用它在python上执行数百万条记录数据库中的统计数据,用于production sites,这些数据库必须在不到一秒的时间内返回数​​据。如果你发现比mysql更好的东西,比如postgre,任何python ORM都可以让你轻松切换数据库。最好的部分是有很多python和django工具来监控应用程序性能的各个方面(python执行,mysql加载/保存,内存/交换)。这样你就可以攻击正确的问题。这可能是连续批量mysql读取不是什么会减慢你的速度...