Классификация текста по группам ключевых слов?
У меня есть список требований к программному проекту, собранный из остатков его предшественника. Каждое требование должно соответствовать одной или нескольким категориям. Каждая из категорий состоит из группы ключевых слов. Что я пытаюсь сделать, так это найти алгоритм, который дал бы мне рейтинг баллов, в какую из категорий каждое требование, вероятно, попадет. Результаты будут использоваться в качестве отправной точки для дальнейшей классификации требований.
в качестве примера предположим, что у меня есть требование:
система применяет депозиты на указанный счет клиента.
и категории / ключевые слова:
- операции с клиентами: депозиты, депозит, клиент, счет, счета
- балансовые счета: счета, счета, дебеты, кредиты
- другая категория: foo, bar
Я хотел бы, чтобы алгоритм забил требование самое высокое в категории 1, ниже в категории 2, и совсем не в категории 3. Механизм подсчета очков в основном не имеет значения для меня, но должен передать, насколько более вероятна категория 1, чем категория 2.
Я новичок в НЛП, поэтому я в недоумении. Я читал обработка естественного языка в Python и надеялся применить некоторые понятия, но не видел ничего, что вполне подходит. Я не думаю, что простое частотное распределение будет работать, так как текст, который я обрабатываю, настолько мал (один предложение.)
2 ответов
вы можете посмотреть категорию "меры сходства" или "меры расстояния"(которая отличается, на жаргоне интеллектуального анализа данных, чем "классификация".)
в принципе, мера сходства-это способ в математике, который вы можете:
- взять два набора данных (в вашем случае, слова)
- сделать некоторые вычисления / уравнение / алгоритм
- в результате у вас есть некоторое число, которое говорит вам, насколько "похожи" эти данные.
с меры подобия, это число является числом между 0 и 1, где "0" означает "ничего не соответствует вообще" и "1" означает "идентичный"
таким образом, вы можете думать о своем предложении как о векторе, и каждое слово в вашем предложении представляет собой элемент этого вектора. Аналогично для списка ключевых слов каждой категории.
и затем вы можете сделать что-то очень простое: взять "Косинус сходство" или "индекс Жаккара" (в зависимости от структуры ваши данные.)
Что делают обе эти метрики, они берут оба вектора (ваше входное предложение и ваш список "ключевых слов") и дают вам номер. Если вы сделаете это по всем категориям, вы можете ранжировать эти числа, чтобы увидеть, какое совпадение имеет наибольший коэффициент сходства.
пример:
из вашего вопроса:
операции с клиентами: депозиты, депозит, клиент, счет, счета
Так можно построить вектор с 5 элементами: (1, 1, 1, 1, 1). Это означает, что для ключевого слова" транзакции клиента " у вас есть 5 слов, и (это будет звучать очевидно, но) каждое из этих слов присутствует в строке поиска. держись меня.
Итак, теперь вы берете свой приговор:
система применяет депозиты к указанный счет клиента.
Это имеет 2 слова из набора "транзакции клиента": {депозиты, счет, клиент}
(на самом деле, это иллюстрирует еще один нюанс: у вас действительно есть "клиент". Это эквивалентно "клиенту"?)
вектор на ваше предложение может быть (1, 0, 1, 1, 0)
единицы в этом векторе находятся в том же положении, что и единицы в первом векторе, потому что эти слова одинаковы.
Итак, мы можем сказать: сколько раз эти векторы отличаются? Сравним:
(1,1,1,1,1) (1,0,1,1,0)
тю. Они у той же "бит" 3 раза - в 1-й, 3-й и 4-й позиции. Они отличаются только на 2 бита. Итак, предположим, что при сравнении этих двух векторов мы имеем "расстояние" 2. Поздравляю, мы только что вычислили Хэмминга! Чем ниже расстояние Хэмминга, тем больше" похожих " данных.
(разница между мерой "сходства" и мерой "расстояния" заключается в том, что первая нормализуется - она дает вам значение между 0 и 1. Расстояние-любое число, так это дает только относительную ценность.)
в любом случае, это может быть не лучший способ обработки естественного языка, но для ваших целей это самый простой и может работать довольно хорошо для вашего приложения или, по крайней мере, в качестве отправной точки.
(PS:" классификация "- как у вас в названии - будет отвечать на вопрос " если вы возьмете мое предложение, в какую категорию оно, скорее всего, попадет?"Что немного отличается от того, чтобы сказать "насколько больше похоже мое предложение в категории 1 категории 2?"что кажется, то, что вы после.)
удачи!
основными характеристиками задачи являются:
- внешне определенные критерии категоризации (список ключевых слов)
- классифицируемые элементы (строки из документа требования) состоят из относительно небольшого количества значений атрибутов для одного измерения: "ключевое слово".
- как определено, нет обратной связи / калибрарион (хотя может быть уместно предложить некоторые из этого)
эти характеристики приносят как хорошие и плохая новость: реализация должна быть относительно прямой, но последовательный уровень точности процесса категоризации может быть трудно достичь. Также небольшие количества различных количеств(количество возможных категорий, максимальное / среднее количество слов в номенклатуре и т. д.) должно дать нам место для выбора решений, которые могут быть CPU и/или Space intentsive, если это необходимо.
тем не менее, даже с этой лицензией получил "go fancy", я предлагаю начать с (и оставаться рядом) до a простой алгоритм и тратить на этом основании С некоторыми дополнениями и соображениями, оставаясь бдительным вездесущей опасности, называемой чрезмерной.
базовый алгоритм (концептуальный, т. е. не фокусироваться на производительности трюк в это время)
Parameters = CatKWs = an array/hash of lists of strings. The list contains the possible keywords, for a given category. usage: CatKWs[CustTx] = ('deposits', 'deposit', 'customer' ...) NbCats = integer number of pre-defined categories Variables: CatAccu = an array/hash of numeric values with one entry per each of the possible categories. usage: CatAccu[3] = 4 (if array) or CatAccu['CustTx'] += 1 (hash) TotalKwOccurences = counts the total number of keywords matches (counts multiple when a word is found in several pre-defined categories) Pseudo code: (for categorizing one input item) 1. for x in 1 to NbCats CatAccu[x] = 0 // reset the accumulators 2. for each word W in Item for each x in 1 to NbCats if W found in CatKWs[x] TotalKwOccurences++ CatAccu[x]++ 3. for each x in 1 to NbCats CatAccu[x] = CatAccu[x] / TotalKwOccurences // calculate rating 4. Sort CatAccu by value 5. Return the ordered list of (CategoryID, rating) for all corresponding CatAccu[x] values about a given threshold.
простой, но правдоподобный: мы предпочитаем категории, которые имеют наибольшее количество матчей, но мы делим на общее количество матчей, чтобы уменьшить рейтинг доверия, когда было найдено много слов. обратите внимание, что это деление не влияет на относительное ранжирование выбора категории для данного элемента, но может быть существенным при сравнении рейтинга различных элементов.
теперь на ум приходит несколько простых улучшений: (я бы серьезно рассмотрел первые два и дал мысли другим; решение по каждому из них очень привязано к сфере проекта, статистическому профилю данных, которые будут классифицированы и другие факторы...)
- мы должны нормализовать ключевые слова, прочитанные из входных элементов, и / или сопоставить их таким образом, чтобы это было терпимо к ошибкам. Поскольку у нас так мало слов для работы, нам нужно убедиться, что мы не потеряем значительную из-за глупой опечатки.
- мы должны уделять больше внимания словам, которые встречаются реже в CatKWs. Например, слово "учетная запись" должно быть меньше, чем слово " foo " или "credit"
- мы могли бы (но, возможно, это не будет будьте полезны или даже полезны) придайте больше веса рейтингам предметов, у которых меньше [нешумовых] слов.
- мы могли бы также включить рассмотрение на основе диграмм (два последовательных слова), ибо с естественными языками (и требования документов не совсем естественны :-) ) близость слов часто является более сильным показателем того, что сами слова.
- мы могли бы добавить немного важности к категории, присвоенной предыдущему (или даже следующему, в логике взгляда вперед) пункту. Деталь вероятно придет в родственную серию и мы можем извлечь пользу из этой регулярности.
кроме того, помимо расчета рейтинга per-se, мы также должны рассмотреть:
- некоторые показатели, которые будут использоваться для оценки самого результата алгоритма (tbd)
- некоторая логика, чтобы собрать список слов, связанных с назначенной категорией, и в конечном итоге запустить статистику по ним. Это может позволить идентифицировать слова, представляющие категорию и изначально не указан в CatKWs.
вопрос о метриках следует рассматривать раньше, но для этого также потребуется ссылочный набор входных элементов: "обучающий набор", хотя мы работаем с заранее определенной категорией словаря-ключевые слова (обычно обучающие наборы используются для определения этого самого списка ключевых слов категории вместе с весовым коэффициентом). Конечно, такой справочный / учебный набор должен быть как статистически значимым, так и статистически представитель [всего набора].
подведем итоги: палкой простые подходы в любом случае, контекст не оставляет места очень необычные. Рассмотрим введение способ измерения эффективности конкретных алгоритмов (или определенных параметров в рамках данного алгоритма), но будьте осторожны, что такие показатели могут быть ошибочными и предложить вам специализировать решение для данного набора в ущерб другим элементам (слишком хорошо!--15-->).