2

我想用 scikit-learn (或 nltk 或对其他建议持开放态度)尝试 tfidf。我拥有的数据是我们已经抓取并存储在 mongoDB 中的相对大量的论坛帖子(~65k)。每个帖子都有一个帖子标题、发布日期和时间、帖子消息的文本(或回复:如果对现有帖子的回复)、用户名、消息 ID 以及它是子帖子还是父帖子(在线程中,您有原始帖子,然后回复此操作或嵌套回复,树)。

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

为了将数据加载到 scikit,我知道:
http ://scikit-learn.org/dev/modules/generated/sklearn.datasets.load_files.html (但我的数据没有分类) http://scikit-learn。 org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html - 对于输入,我知道我会使用文件名,但是因为我会有大量文件(每个帖子),有没有办法要么从文本文件中读取文件名?或者是否有一些示例实现有人可以指出我?

此外,关于为每个讨论论坛帖子构建文件名的任何建议,以便稍后确定我何时获得 tfidf 向量和余弦相似度数组

谢谢

4

2 回答 2

5

您可以传递python 生成器或文件名或字符串对象的生成器表达式而不是列表,因此可以在执行过程中从驱动器中延迟加载数据。这是一个CountVectorizer将生成器表达式作为参数的玩具示例:

>>> 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>

请注意,生成器支持可以直接从 MongoDB 查询结果迭代器中对数据进行矢量化,而不是通过文件名。

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

关于为每个讨论论坛帖子构建文件名的任何建议,以便稍后确定我何时获得 tfidf 向量和余弦相似度数组

只需使用确定性排序,就可以在将文件名列表提供给矢量化器之前对其进行排序。

于 2013-10-17T06:51:36.823 回答
0

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

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)

于 2013-11-11T06:43:59.890 回答