使用Sci-Kit学习使用大型语料库对文本进行分类

yon*_*ano 7 python classification scikit-learn

我的数据库中有大约1600篇文章,每篇文章都已经预先标记了以下类别之一:

Technology
Science
Business
World
Health
Entertainment
Sports
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用sci-kit学习构建一个分类新文章的分类器.(我想我会将训练数据分成两半,用于训练和测试?)

我希望使用tf-idf,因为我没有停止词的列表(我可以使用NLTK仅提取形容词和名词,但我宁愿给scikit - 学习完整的文章).

我已经阅读了关于scikit-learn的所有文档,但是他们的例子涉及单词出现和N-gram(很好),但他们从未指定如何将一段数据绑定到标签.

我已经尝试过查看他们的示例代码了,但是它太难以理解了.

有人可以帮我解决这个问题,还是指出我正确的方向?

谢谢.

Rol*_*Max 12

我认为你在我开始将自己的数据提供给分类器时遇到了同样的问题.

您可以使用该功能sklearn.datasets.load_files,但为此,您需要创建此结构:

train
??? science
?   ??? 0001.txt
?   ??? 0002.txt
??? technology
    ??? 0001.txt
    ??? 0002.txt
Run Code Online (Sandbox Code Playgroud)

其中子目录train被命名为标签,而标签目录中的每个文件都是具有该对应标签的文章.然后load_files用来加载数据:

In [1]: from sklearn.datasets import load_files

In [2]: load_files('train')
Out[2]: 
{'DESCR': None,
 'data': ['iphone apple smartphone\n',
  'linux windows ubuntu\n',
  'biology astrophysics\n',
  'math\n'],
 'filenames': array(['train/technology/0001.txt', 'train/technology/0002.txt',
       'train/science/0002.txt', 'train/science/0001.txt'], 
      dtype='|S25'),
 'target': array([1, 1, 0, 0]),
 'target_names': ['science', 'technology']}
Run Code Online (Sandbox Code Playgroud)

返回的对象是a sklearn.datasets.base.Bunch,这是一个简单的数据包装器.这是一种开始使用分类器的直接方法,但是当您的数据更大并且频繁更改时,您可能希望停止使用文件并使用例如数据库来存储标记文档,并且可能具有比仅仅普通文件更多的结构文本.基本上,您需要生成类别列表(或target_names),并将列表中每个文档['science', 'technology', ...]target值指定为data列表中标记类别的索引target_names.长度datatarget必须相同.

你可以看一下我之前写的这个脚本来运行一个分类器:https://github.com/darkrho/yatiri/blob/master/scripts/run_classifier.py#L267