我想尝试使用tfidf和scikit-learn (或者nltk,或者我可以接受其他建议)。我拥有的数据是我们抓取并存储在mongoDB中的相对大量的论坛帖子(~65k)。每个帖子都有一个帖子标题、帖子的日期和时间、帖子消息的文本(或re:如果是对现有帖子的回复)、用户名、消息ID以及它是子帖子还是父帖子(在线程中,您拥有原始帖子,然后回复此op,或嵌套回复树)。
我认为每个帖子都是一个单独的文档,类似于20个新闻组,每个文档都有我在顶部提到的字段,消息帖子的文本在底部,我将从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向量和余弦相似数组,有什么建议吗?
谢谢
发布于 2013-10-17 06:51:37
您可以传递文件名或字符串对象的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查询结果迭代器向量化数据,而不是通过文件名。
另外,一个包含65k个文件名的列表,每个文件名包含10个字符,在内存中只有650kB (+ python列表的开销),所以提前加载所有的文件名应该不是问题。
任何关于构造每个论坛帖子的文件名的建议,以便稍后识别我何时获得tfidf向量和余弦相似数组
只需使用确定性排序,以便能够在将文件名列表提供给向量化器之前对其进行排序。
发布于 2013-11-11 06:44:00
我能够得到这些任务..如果有用,下面是用于指定一组要使用的文本文件的代码,以及如何设置标志和传递文件名
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)
https://stackoverflow.com/questions/19419245
复制