互联网文章和社交媒体的分层分类+主题模型训练数据

时间:2013-11-05 21:40:29

标签: nltk scikit-learn hierarchical-clustering topic-modeling training-data

我想按主题对大量(100K到1M +)的小型互联网文章(推文,博客文章,新闻等)进行分类。为了实现这一目标,我一直在寻找标记的培训数据文档,我可以用它来构建分类器模型。为了使这篇文章最有用,以下是我发现的一些可能的来源:

a)www.freebase.com/internet/website/category?instances=

b)wikipedia-miner.cms.waikato.ac.nz(访问维基百科数据的工具包)

c)en.wikipedia.org/wiki/Wikipedia:Database_download

d)wiki.dbpedia.org/About(属于类别的SKOS格式主题关键字)

e)互联网搜索大型文章集,然后进行聚类和手动策划

问题1:是否有额外的互联网资源可以提供标记的培训文件?关于给定主题的关键字集,尤其是加权集也是有用的

理想情况下,我想构建一个分类器,该分类器将返回分层类别,并且可以在以后添加子主题详细信息,因为更多兴趣/数据可用。

问题2:是否存在分层结构(也可能是可扩展的)主题建模/分类框架?一个代码示例将特别受欢迎

非常感谢

更新

路透社语料库第1卷(在RCV1-v2上搜索) 从1990年代后期开始的约80万条路透社文章被人类分类为主题,行业和地区类别

学术联盟(LDC)分发各种语料库, 包括由纽约时报编制的约1.5M标签文件: http://catalog.ldc.upenn.edu/LDC2008T19

1 个答案:

答案 0 :(得分:2)

缺乏标记数据是一个困扰机器学习的许多应用的问题。为了澄清,你是否正在寻找一个人,他看过你的推文,博客文章和新闻,标记了来源,并发布了该数据库?或者程序是否可以进行分类?在前一种情况下,关键字似乎是一个很好的分类方案,但实际上并非如此:不同的人会为相同的内容选择不同的关键字。这将从根本上损害您的机器学习过程。

我的观点是在任何一种情况下你应该使用无监督学习(没有提供标签)而不是监督学习(提供标签) - 你不应该寻找标签数据,因为你找不到它。即使您遇到一些已被程序标记的数据,该程序也可能使用了无监督的学习方法。

我建议你使用scikit-learn的集群模块中定义的一些函数。这些实施了无监督学习技术。

UC Irvine拥有大量机器学习数据集。您可以在某些数据集上测试一些自然语言处理工作。一个流行的数据集是安然电子邮件数据集。它和其他4个编译为here

UCI数据集很棒,但它们不是scikit-learn格式。你将不得不转换他们。我通常使用虹膜数据集,因为它很小,您可以轻松地使用scikit - 以这种方式学习。正如您在此example行中所看到的那样

est.fit(X)

只需要数据数组X而不需要标签Y。

X = iris.data

通过4_features numpy数组向X分配150_instances。您需要此表单中的UCI数据。让我们来看看NYTimes的新闻文章。

来自UCI链接说明中的readme.txt

For each text collection, D is the number of documents, W is the
number of words in the vocabulary, and N is the total number of words
in the collection (below, NNZ is the number of nonzero counts in the
bag-of-words). After tokenization and removal of stopwords, the
vocabulary of unique words was truncated by only keeping words that
occurred more than ten times.
...
NYTimes news articles:
orig source: ldc.upenn.edu
D=300000
W=102660
N=100,000,000 (approx)

也就是说,你的X将通过102660_features形成300000_instances形状。请注意属性格式:

Attribute Information:

The format of the docword.*.txt file is 3 header lines, followed by
NNZ triples:
---
D
W
NNZ
docID wordID count
docID wordID count
docID wordID count
docID wordID count
...
docID wordID count
docID wordID count
docID wordID count
---

此数据位于docword.nytimes.txt数据文件中。一些代码来读取它并运行聚类算法:

import numpy as np
from sklearn.cluster import KMeans
with open('docword.nytimes.txt','r') as f:
    # read the header information
    n_instances = int(f.readline())
    n_attributes = int(f.readline())
    n_nnz = int(f.readline()) 

    # create scikit-learn X numpy array
    X = np.zeros((n_instances, n_attributes))
    for line in f:
        doc_id, word_id, count = line.split() 
        X[doc_id, word_id] = count

# run sklearn clustering on nytimes data
n_clusters = 8
est = KMeans(n_clusters)
est.fit(X)

不幸的是,这需要大量内存。实际上,比我的机器有更多的内存,所以我无法测试这段代码。不过,我认为您的应用程序域与此类似。您将不得不查看某些降维技术或仅查看一次较小的单词子集。

我希望这会有所帮助。随时给我发消息。