Как использовать n-граммы для классификации по нескольким меткам?
Я работаю над проектом по определению гражданства человека на основе того, как он общается на английском языке. У меня 10 национальностей и 1000 файлов, по 100 для каждой национальности. Я использую n-граммы в качестве функций и ищу подтверждения моего подхода. Моя структура данных будет иметь различные n-граммы (символьные n-граммы, би-граммы, как столбцы) в качестве признаков и национальность в виде меток (в виде строк). Мои шаги:
- Подберите все файлы для данной национальности (FINE). 1.1. Объедините их вместе, чтобы сформировать корпус текста (например, объедините 100 файлов в 1 большой файл). Сначала я думал, что нужно брать по одному файлу за раз и обновлять количество n-грамм в зависимости от их наличия. Но затем для каждой новой n-граммы мне нужно было бы посмотреть, не произошло ли это уже, а затем обновить частоту для данной метки. Будет ли это лучший подход?
- Извлекайте би-граммы / три-граммы и получайте частоту каждого грамма. (NLTK имеет FreqDist, который дает счет для каждого)
- Сохраните эту информацию, чтобы я мог использовать ее для классификации моего тестового набора. (КАК ХРАНИТЬ ЭТУ ИНФОРМАЦИЮ. БОЛЬШЕ ИНФОРМАЦИИ НИЖЕ)
Вопрос в том, должен ли я хранить n-грамм и информацию о частоте в матрице (единую матрицу, имеющую все n-грамм и метки ИЛИ отдельную матрицу для каждой метки) или я должен хранить ее как карту (карту для каждой метки, имеющую n -грамма и ее частота подсчета). Я хотел бы иметь структуру данных (для хранения извлеченной информации), которую было бы легко классификаторам принять в качестве входных данных и обработать их. Я не могу предвидеть, какая структура данных будет лучшим вариантом.
1 ответ
1) это не должно иметь значения. если у вас есть способ сделать это отдельно, а затем объединить его, это поможет, если в будущем вы захотите масштабироваться до распределенной системы (это обычно называется подходом с уменьшением карты).
2) хорошо
3) n-грамм и частотный отсчет обычно не подходят сами по себе для классификации признаков. Вы, вероятно, хотите иметь отдельные матрицы / карты для каждой метки, а затем использовать что-то вроде TF-IDF ( https://en.wikipedia.org/wiki/Tf%E2%80%93idf), чтобы идентифицировать n-граммы, характерные для конкретный ярлык.
4) когда дело доходит до классификации, вы должны построить вектор фиксированной длины, в котором вы выбираете поднабор нграмм, идентифицированных для каждой метки на предыдущем шаге, а затем используете его для обучения и классификации. вам, вероятно, потребуется некоторая нормализация для подсчета.