Загрузите пользовательский набор данных (который похож на набор из 20 групп новостей) в Scikit для классификации текстовых документов


Я пытаюсь запустить Этот пример кода scikit для моего пользовательского набора данных TED Talks. Каждый каталог-это тема, под которой находятся текстовые файлы, содержащие описание каждого выступления Ted.

Вот как выглядит древовидная структура моих наборов данных. Как вы видите, каждый каталог-это тема, а ниже-текстовые файлы, содержащие описание.

Topics/
|-- Activism
|   |-- 1149.txt
|   |-- 1444.txt
|   |-- 157.txt
|   |-- 1616.txt
|   |-- 1706.txt
|   |-- 1718.txt
|-- Adventure
|   |-- 1036.txt
|   |-- 1777.txt
|   |-- 2930.txt
|   |-- 2968.txt
|   |-- 3027.txt
|   |-- 3290.txt
|-- Advertising
|   |-- 3673.txt
|   |-- 3685.txt
|   |-- 6567.txt
|   `-- 6925.txt
|-- Africa
|   |-- 1045.txt
|   |-- 1072.txt
|   |-- 1103.txt
|   |-- 1112.txt
|-- Aging
|   |-- 1848.txt
|   |-- 2495.txt
|   |-- 2782.txt
|-- Agriculture
|   |-- 3469.txt
|   |-- 4140.txt
|   |-- 4733.txt
|   |-- 4939.txt

Я сделал свой набор данных в такой форме, чтобы он напоминал группу 20news, древовидная структура которой такова:

20news-18828/
|-- alt.atheism
|   |-- 49960
|   |-- 51060
|   |-- 51119

|-- comp.graphics
|   |-- 37261
|   |-- 37913
|   |-- 37914
|   |-- 37915
|   |-- 37916
|   |-- 37917
|   |-- 37918
|-- comp.os.ms-windows.misc
|   |-- 10000
|   |-- 10001
|   |-- 10002
|   |-- 10003
|   |-- 10004
|   |-- 10005 

В исходный код (98-124), это способ загрузки данных обучения и тестирования непосредственно из scikit.

print("Loading 20 newsgroups dataset for categories:")
print(categories if categories else "all")

data_train = fetch_20newsgroups(subset='train', categories=categories,
                                shuffle=True, random_state=42,
                                remove=remove)

data_test = fetch_20newsgroups(subset='test', categories=categories,
                               shuffle=True, random_state=42,
                               remove=remove)
print('data loaded')

categories = data_train.target_names    # for case categories == None
def size_mb(docs):
    return sum(len(s.encode('utf-8')) for s in docs) / 1e6

data_train_size_mb = size_mb(data_train.data)
data_test_size_mb = size_mb(data_test.data)

print("%d documents - %0.3fMB (training set)" % (
    len(data_train.data), data_train_size_mb))
print("%d documents - %0.3fMB (test set)" % (
    len(data_test.data), data_test_size_mb))
print("%d categories" % len(categories))
print()

# split a training set and a test set
y_train, y_test = data_train.target, data_test.target

Поскольку этот набор данных был доступен с Scikit, все его метки и т. д. были встроены. В моем случае я знаю, как загрузить набор данных (строка 84):

dataset = load_files('./TED_dataset/Topics/')
Я понятия не имею, что мне делать после этого. Я хочу знать, как я должен разделить эти данные в обучении и тестировании и создать эти метки из моего набора данных:
data_train.data,  data_test.data 

В общем, я просто хочу загрузить мой набор данных, запустите его на этом коде без ошибок. Я загрузил набор данныхсюда для тех, кто может захотеть его увидеть.

Я сослался на этот вопрос, который кратко говорит о нагрузке испытательного поезда. Я также хочу знать, как data_train.имена target_names должны быть извлечены из моего набора данных.

Правка:

Я попытался получить поезд и тест, который возвращает ошибку:

dataset = load_files('./TED_dataset/Topics/')
train, test = train_test_split(dataset, train_size = 0.8)

Обновленный код-это здесь.

2 5

2 ответа:

Я думаю, что вы ищете что-то вроде этого:

In [1]: from sklearn.datasets import load_files

In [2]: from sklearn.cross_validation import train_test_split

In [3]: bunch = load_files('./Topics')

In [4]: X_train, X_test, y_train, y_test = train_test_split(bunch.data, bunch.target, test_size=.4)

# Then proceed to train your model and validate.
Обратите внимание, что bunch.target - это массив целых чисел, являющихся индексами имен категорий, хранящихся в bunch.target_names.
In [14]: X_test[:2]
Out[14]:
['Psychologist Philip Zimbardo asks, "Why are boys struggling?" He shares some stats (lower graduation rates, greater worries about intimacy and relationships) and suggests a few reasons -- and challenges the TED community to think about solutions.Philip Zimbardo was the leader of the notorious 1971 Stanford Prison Experiment -- and an expert witness at Abu Ghraib. His book The Lucifer Effect explores the nature of evil; now, in his new work, he studies the nature of heroism.',
 'Human growth has strained the Earth\'s resources, but as Johan Rockstrom reminds us, our advances also give us the science to recognize this and change behavior. His research has found nine "planetary boundaries" that can guide us in protecting our planet\'s many overlapping ecosystems.If Earth is a self-regulating system, it\'s clear that human activity is capable of disrupting it. Johan Rockstrom has led a team of scientists to define the nine Earth systems that need to be kept within bounds for Earth to keep itself in balance.']

In [15]: y_test[:2]
Out[15]: array([ 84, 113])

In [16]: [bunch.target_names[idx] for idx in y_test[:2]]
Out[16]: ['Education', 'Global issues']

С помощью кода, который вы цитируете, набор данных загружается из пакета sklearn, а также обучающие и тестовые наборы (с помощью функции fetch_20newsgroup()). Если вы хотите загрузить свой собственный набор данных, вы должны предварительно обработать ваши данные, векторизовать текст, извлечь объекты и предпочтительно поместить все в хорошие массивы numpy или матрицы. Есть соответствующие функции, которые делают это за вас. Код, который вы цитируете, ничего не может сделать с обычными текстовыми файлами (вычисления, основанные только на буквах и словах, являются трудно в любом случае ; -)).

Как только вы дойдете до этого момента, вы определяете свое обучение и свой набор тестов. Обычно 90% данных используется для обучения, а 10% - в качестве тестовых данных. Если вы хотите пойти еще дальше, вы можете использовать 10-кратную перекрестную проверку, в которой вы разделяете свои данные на 10 частей, тренируетесь на первых 9 и тестируете на 10-м в первом раунде, тренируетесь на первых 8 и 10-м и тестируете на 9-м во втором раунде и так далее и тому подобное.