tf-idf有点大(65k)的文本文件

时间:2013-10-17 05:57:03

标签: nlp nltk scikit-learn tf-idf

我想用scikit-learn(或者nltk或者对其他建议开放)尝试使用tfidf。我拥有的数据是相当多的讨论论坛帖子(~65k)我们已经抓取并存储在mongoDB中。每个帖子都有帖子标题,帖子的日期和时间,帖子消息的文本(或者re:如果对现有帖子的回复),用户名,消息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向量和余弦相似性数组

由于

2 个答案:

答案 0 :(得分:5)

您可以传递文件名或字符串对象的python generator或生成器表达式而不是列表,因此可以随时从驱动器中延迟加载数据。这是一个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向量和余弦相似性数组

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

答案 1 :(得分: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)