Nlp tf idf在数量稍大(65k)的文本文件上

Nlp tf idf在数量稍大(65k)的文本文件上,nlp,nltk,scikit-learn,tf-idf,Nlp,Nltk,Scikit Learn,Tf Idf,我想用scikit learn(或nltk)尝试tfidf,或者我愿意接受其他建议。我拥有的数据是我们在mongoDB中收集并存储的相对大量的讨论论坛帖子(约65k)。每个帖子都有一个帖子标题、发布日期和时间、帖子消息文本(或回复现有帖子的回复)、用户名、消息ID以及它是子帖子还是父帖子(在一个线程中,您拥有原始帖子,然后回复此op,或嵌套回复树) 我认为每个帖子都是一个单独的文档,与20个新闻组类似,每个文档的顶部都有我提到的字段,底部是消息帖子的文本,我将从mongo中提取出来,并写入每个文

我想用scikit learn(或nltk)尝试tfidf,或者我愿意接受其他建议。我拥有的数据是我们在mongoDB中收集并存储的相对大量的讨论论坛帖子(约65k)。每个帖子都有一个帖子标题、发布日期和时间、帖子消息文本(或回复现有帖子的回复)、用户名、消息ID以及它是子帖子还是父帖子(在一个线程中,您拥有原始帖子,然后回复此op,或嵌套回复树)

我认为每个帖子都是一个单独的文档,与20个新闻组类似,每个文档的顶部都有我提到的字段,底部是消息帖子的文本,我将从mongo中提取出来,并写入每个文本文件所需的格式

对于将数据加载到scikit,我知道:
(但我的数据没有分类) -对于输入,我知道我会使用文件名,但是因为我会有大量的文件(每篇文章),有没有一种方法可以让文件名从文本文件中读取?或者是否有人可以为我提供一些示例实现

还有,关于这些讨论论坛帖子的文件名结构的建议,以便以后在获取tfidf向量和余弦相似性数组时进行识别

谢谢

您可以传递文件名或字符串对象的表达式或生成器表达式,而不是列表,这样就可以在运行时从驱动器缓慢加载数据。下面是一个
countvectorier
以生成器表达式作为参数的玩具示例:

>>> from sklearn.feature_extraction.text import CountVectorizer
>>> CountVectorizer().fit_transform(('a' * i for i in xrange(100)))
<100x98 sparse matrix of type '<type 'numpy.int64'>'
    with 98 stored elements in Compressed Sparse Column format>
>>来自sklearn.feature\u extraction.text import countvectorier
>>>CountVectorizer().fit_变换(('a'*i代表x范围(100))中的i)
请注意,生成器支持可以直接从MongoDB查询结果迭代器中对数据进行矢量化,而不是遍历文件名

另外,一个包含65k个文件名(每个文件名10个字符)的列表在内存中只有650kB(+python列表的开销),因此提前加载所有文件名应该不会有问题

对于这些论坛帖子的文件名的结构有何建议,以便以后在获取tfidf向量和余弦相似性数组时进行识别


只需使用确定性排序即可对文件名列表进行排序,然后再将其馈送给矢量器。

我能够完成这些任务。。如果有帮助,下面是指定要使用的一组文本文件的代码,以及如何设置标志和传递文件名

path = "/wherever/yourfolder/oftextfiles/are"
filenames = os.listdir(path)
filenames.sort()

try:
    filenames.remove('.DS_Store') #Because I am on a MAC
except ValueError:
    pass # or scream: thing not in some_list!
except AttributeError:
    pass # call security, some_list not quacking like a list!

vectorizer = CountVectorizer(input='filename', analyzer='word', strip_accents='unicode', stop_words='english') 
X=vectorizer.fit_transform(filenames)
mongo db部分是基本的,但根据其价值(查找boardid 10类型的所有条目并按messageid升序排序):


cursor=coll.find({'boardid':10}).sort('messageid',1)

谢谢,这非常有用。为了“好玩”,我想尝试直接从mongoDB获取数据。在这种情况下,查询结果的顺序将与向量和数组的顺序相同……(我假设,但我将在这里重复检查并发回结果)是的,您必须这样做,否则您将无法解释哪个特征向量来自哪个MongoDB文档。