【问题标题】:tf-idf on a somewhat large (65k) amount of text filestf-idf 处理大量(65k)文本文件
【发布时间】:2013-10-25 12:02:37
【问题描述】:

我想用 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 向量和余弦相似度数组

谢谢

【问题讨论】:

    标签: nlp nltk scikit-learn tf-idf


    【解决方案1】:

    您可以传递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 向量和余弦相似度数组

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

    【讨论】:

    • 谢谢,这很有帮助。为了“有趣”,我想尝试直接从 mongoDB 获取数据。在这种情况下,查询结果的顺序将与向量和数组的顺序相同......(我假设但我会在这里仔细检查并回发结果)
    • 是的,您必须 fix the order of the MongoDB query 否则您将无法解释哪个特征向量来自哪个 MongoDB 文档。
    【解决方案2】:

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

    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-24
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 1970-01-01
      相关资源
      最近更新 更多