我的数据库中有大约 1600 篇文章,每篇文章都已预先标记为以下类别之一:
Technology
Science
Business
World
Health
Entertainment
Sports
我正在尝试使用 sci-kit learn 来构建一个分类器来对新文章进行分类。(我想我会将我的训练数据分成两半,用于训练和测试?
我希望使用 tf-idf,因为我没有停用词列表(不过,我可以使用 NLTK 只提取形容词和名词,但我宁愿给 scikit-learn 整篇文章)。
我已经阅读了所有关于scikit-learn的文档,但是它们的示例涉及单词出现和N-gram(这很好),但它们从未指定如何将一段数据绑定到标签。
我试过查看他们的示例代码,但它太混乱了,无法遵循。
有人可以帮助我解决这个问题,或者为我指出正确的方向吗?
谢谢。
我想你遇到了与我开始将自己的数据提供给分类器时相同的问题。
您可以使用函数 sklearn.datasets.load_files
,但要做到这一点,您需要创建以下结构:
train
├── science
│ ├── 0001.txt
│ └── 0002.txt
└── technology
├── 0001.txt
└── 0002.txt
其中train
的子目录被命名为标签,标签目录中的每个文件都是具有相应标签的文章。然后使用 load_files
加载数据:
In [1]: from sklearn.datasets import load_files
In [2]: load_files('train')
Out[2]:
{'DESCR': None,
'data': ['iphone apple smartphonen',
'linux windows ubuntun',
'biology astrophysicsn',
'mathn'],
'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']}
返回的对象是一个简单的数据包装器sklearn.datasets.base.Bunch
。这是开始使用分类器的简单方法,但是当您的数据较大且频繁更改时,您可能希望停止使用文件并使用数据库来存储标记的文档,并且可能具有比纯文本更多的结构。基本上,您需要生成类别(或target_names
)列表,例如['science', 'technology', ...]
,并为data
列表中的每个文档分配target
值作为target_names
列表中标记类别的索引。data
和target
的长度必须相同。
你可以看看我之前写的这个脚本来运行分类器:https://github.com/darkrho/yatiri/blob/master/scripts/run_classifier.py#L267
也许从这里的例子开始:http://scikit-learn.org/dev/auto_examples/document_classification_20newsgroups.html#example-document-classification-20newsgroups-py
一个更高级的例子是:http://scikit-learn.org/dev/auto_examples/grid_search_text_feature_extraction.html#example-grid-search-text-feature-extraction-py
示例库中还有更多文本示例:http://scikit-learn.org/dev/auto_examples/index.html