首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >tf-idf适用于较大(65k)的文本文件

tf-idf适用于较大(65k)的文本文件
EN

Stack Overflow用户
提问于 2013-10-17 13:57:03
回答 2查看 2.8K关注 0票数 2

我想尝试使用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向量和余弦相似数组,有什么建议吗?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2013-10-17 14:51:37

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

代码语言:javascript
代码运行次数:0
运行
复制
>>> 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向量和余弦相似数组

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

票数 5
EN

Stack Overflow用户

发布于 2013-11-11 14:44:00

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

代码语言:javascript
代码运行次数: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)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19419245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档