我在Postgres数据库中存储了大约300k文档,这些文档标记有主题类别(总共有大约150个类别).我有另外150k文件还没有类别.我正在努力寻找以编程方式对它们进行分类的最佳方法.
我一直在探索NLTK及其朴素贝叶斯分类器.似乎是一个很好的起点(如果你可以建议一个更好的分类算法来完成这项任务,我会全力以赴).
我的问题是我没有足够的RAM来同时训练所有150个categoies/300k文件上的NaiveBayesClassifier(5个类别的培训使用8GB).此外,随着我在更多类别上的训练,分类器的准确性似乎下降(2个类别的准确度为90%,5%为61%,10个为61%).
我是否应该一次训练5个类别的分类器,并通过分类器运行所有150k文件以查看是否有匹配?看起来这样可行,除了会有很多误报,其中没有真正匹配任何类别的文档因为它是可用的最佳匹配而被分类器打开了...是否存在如果文档不适合任何类别,为分类器提供"无上述"选项的方法是什么?
我正在尝试使用TF-IDF将文档分类.我已经为某些文档计算了tf_idf,但是现在当我尝试计算其中两个文档之间的余弦相似度时,我得到一个追溯说:
#len(u)==201, len(v)==246
cosine_distance(u, v)
ValueError: objects are not aligned
#this works though:
cosine_distance(u[:200], v[:200])
>> 0.52230249969265641
Run Code Online (Sandbox Code Playgroud)
切片向量使len(u)== len(v)正确的方法?我认为余弦相似性适用于不同长度的矢量.
我正在使用这个功能:
def cosine_distance(u, v):
"""
Returns the cosine of the angle between vectors v and u. This is equal to
u.v / |u||v|.
"""
return numpy.dot(u, v) / (math.sqrt(numpy.dot(u, u)) * math.sqrt(numpy.dot(v, v)))
Run Code Online (Sandbox Code Playgroud)
另外 - 向量中tf_idf值的顺序是否重要?它们应该被分类 - 或者对于这个计算是否不重要?
在scikit-learn和中有TF-IDF实现gensim.
有简单的实现在Python中简单实现N-Gram,tf-idf和余弦相似性
为了避免重新发明轮子,
在这篇博文中,它说NLTK没有它.真的吗? http://www.bogotobogo.com/python/NLTK/tf_idf_with_scikit-learn_NLTK.php
这个问题是从分拆这个问题.我的询问是双重的,但由于两者都是相关的,我认为将它们放在一起是个好主意.
- 编辑 -
我将给出一个我想要的查询的需求示例:
假设我有5个字段:
所有字段都是可选字段,最后一个字段应搜索所有其他字段.我查看每个字段,看看它是否是IsNullOrEmpty().如果不是,我想附加我的查询的一部分,以便添加相关的搜索部分.
名字和姓氏应该是完全匹配,并且比其他字段具有更多权重.年龄是一个字符串,应该完全匹配.地址可以按顺序变化.一切也可以按顺序变化.
我该怎么办呢?
我正在寻找一个非传统文本搜索的文本搜索引擎,我想知道哪种工具(Lucene,Sphinx,Xapian或其他)最适合我,以及从哪里开始的指示.
我有分子表示为图(原子和键).我有办法枚举大小为k的所有子图.作为技术,输入是SMILES,输出是规范的SMARTS和每个子图/ SMARTS出现的次数.
例如,如果输入分子是" CCO ",那么规范结果是{"C":2,"O":1,"CC":1,"OC":1,"CCO":1}并且如果分子是" SCO ",则规范结果是{"C":1,"S":1,"O":1,"CS":1,"OC":1,"SCO":1}.这些都是很小的例子.对于真正的分子,我得到了大约500个"单词",看起来像"CC(C)O","CCCOCC","cn"和"cccc(c)O".
将分子视为特征字符串加上计数的集合意味着我应该能够使用文本搜索工具在文本级别进行比较,希望它们在化学级别上有意义.
举例来说,我可以使用余弦相似度或者tf-idf权重,并通过寻找类似的子模式找到类似的分子.通过上面的"CCO"和"SCO"示例,余弦相似度为(2*1 + 1*1 + 1*1)/ sqrt(2*2 + 1*1 + 1*1 + 1*1 + 1*1)/ sqrt(6*(1*1))= 4/sqrt(8*6)= 0.58.
再举一个例子,如果我想找到含有"CCS"亚结构的分子,那么我可以根据计数进行快速反向索引搜索(分子必须至少有2个"C",至少1个"CS",在解决NP子图的同构问题之前.也就是说,基于文本的方法可以充当过滤器以拒绝明显的不匹配.
我试图弄清楚存在的文本解决方案,但它有点令人生畏.我不需要停词,我不需要词干,我不在乎词序; 我不需要存在很多功能.我确实需要保留单词向量的能力,因为知道"C"是出现2次还是3次是很重要的.
哪个文本搜索引擎最适合我?它看起来像Lucene,特别是在Mahout的工作.您能否推荐一下文档的哪些部分或相关的教程?我发现的那些是用于全文搜索,具有词干和我不需要的其他功能.
我有一个有点高级别的问题,所以我会尝试尽可能具体.
我正在进行大量研究,涉及将不同的数据集与引用同一实体(通常是公司或财务安全性)的标题信息相结合.此记录链接通常涉及标题信息,其中名称是唯一的公共主要标识符,但通常可用某些辅助信息(例如城市和州,操作日期,相对大小等).这些匹配通常是一对多,但可能是一对一甚至多对多.我通常手工完成这种匹配或者对清理过的子串进行非常基本的文本比较.我偶尔使用一种简单的匹配算法,比如Levenshtein距离测量,但我从来没有太多的东西,部分是因为我没有一个很好的正式应用方法.
我的猜测是,这是一个相当普遍的问题,并且必须有一些正式的流程可以用来做这类事情.我已经阅读了一些关于这个主题的学术论文,这些论文涉及给定方法的理论适用性,但我没有找到任何有用的资料来完成一个配方或至少一个实际的框架.
我的问题如下:
有没有人知道实现多维模糊记录匹配的良好来源,如书籍或网站,发表的文章或工作文件?
我更喜欢有实际例子和明确方法的东西.
该方法可以是迭代的,人工检查中间阶段的改进.
(编辑)链接数据用于统计分析.因此,一点点的噪音是可以的,但是对于较少的"错误的不匹配"而言,更少的"不正确的匹配"是强烈的偏好.
如果他们在Python中是很棒的,但不是必需的.
最重要的是,如果重要的是,我不太关心计算效率.我没有动态实现它,我通常处理几千条记录.
theory algorithm string-matching fuzzy-comparison record-linkage
我有大约3000个文本文档,这些文档与文档"有趣"的持续时间有关.因此,假设文档1包含300行文本和内容,这导致持续时间为5.5天,而另一个包含40行文本的文档导致6.7天的持续时间为"有趣",依此类推.
现在的任务是根据文本内容预测感兴趣的持续时间(这是一个连续的值).
我有两个想法来解决这个问题:
想法#1的优点是我也可以计算出我的预测的标准偏差,而对于想法#2,我不太清楚,我如何计算我的预测的不确定性的类似度量.另外我不清楚选择哪些类别从分类器中获得最佳结果.
那么,有一条经验法则是如何构建一个系统来最好地预测文本文档中的连续值(如时间)吗?是应该使用分类器还是应该使用类似文档中的平均值?我在该领域没有真正的经验,并且想知道,您认为哪种方法可能会产生最好的结果.如果您了解可用于解决此问题的简单现有技术(基于Java或Python),则会给出奖励积分.
nlp ×4
python ×4
nltk ×3
lucene ×2
tf-idf ×2
algorithm ×1
graph ×1
java ×1
lucene.net ×1
naivebayes ×1
regression ×1
similarity ×1
sphinx ×1
text-search ×1
theory ×1