Классификация текста на основе групп ключевых слов?

StackOverflow https://stackoverflow.com/questions/1490061

  •  18-09-2019
  •  | 
  •  

Вопрос

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

В качестве примера предположим, что у меня есть требование:

Система применяет депозиты на указанный счет клиента.

И категории/ключевые слова:

  1. Транзакции клиентов:депозиты, депозит, клиент, счет, счета
  2. Балансовые счета:счет, счета, дебет, кредит
  3. Другая категория:фу, бар

Я бы хотел, чтобы алгоритм набрал наивысшую оценку требования в категории 1, ниже в категории 2 и совсем не в категории 3.Механизм оценки для меня в основном не имеет значения, но он должен показать, насколько более вероятна применимость категории 1, чем категории 2.

Я новичок в НЛП, поэтому я в некоторой растерянности.я читал Обработка естественного языка в Python и надеялся применить некоторые концепции, но не увидел ничего подходящего.Я не думаю, что простое частотное распределение сработает, поскольку текст, который я обрабатываю, очень мал (одно предложение).

Это было полезно?

Решение

Возможно, вам захочется посмотреть категорию «меры сходства» или «меры расстояния» (которые на жаргоне интеллектуального анализа данных отличаются от «классификации»).

По сути, мера сходства — это способ в математике, с помощью которого вы можете:

  1. Возьмите два набора данных (в вашем случае слова)
  2. Выполните некоторые вычисления/уравнения/алгоритмы
  3. В результате у вас есть некоторое число, которое говорит вам, насколько «похожи» эти данные.

При использовании мер сходства это число представляет собой число от 0 до 1, где «0» означает «совсем ничего не совпадает», а «1» означает «идентично».

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

И тогда вы можете сделать что-то очень простое:возьми "косинусное подобие" или "Индекс Жаккара" (в зависимости от того, как вы структурируете свои данные.)

Обе эти метрики берут оба вектора (входное предложение и список «ключевых слов») и дают вам число.Если вы сделаете это для всех своих категорий, вы сможете ранжировать эти числа, чтобы увидеть, какое совпадение имеет наибольший коэффициент сходства.

В качестве примера:

Из вашего вопроса:

Транзакции клиентов:Депозиты, депозит, клиент, счета, счета

Итак, вы можете построить вектор из 5 элементов:(1, 1, 1, 1, 1).Это означает, что для ключевого слова «транзакции клиентов» у вас есть 5 слов, и (это звучит очевидно, но) каждое из этих слов присутствует в вашей строке поиска.оставайся со мной.

Итак, теперь вы произносите приговор:

Система должна применять депозиты на указанную учетную запись клиента.

Здесь есть 2 слова из набора «Операции с клиентами»:{депозиты, счет, клиент}

(на самом деле это иллюстрирует еще один нюанс:у вас действительно есть «клиент».Это эквивалентно слову «клиент»?)

Вектор вашего предложения может быть (1, 0, 1, 1, 0).

Единицы в этом векторе находятся в том же положении, что и 1 в первом векторе, потому что эти слова одинаковы.

Итак, мы могли бы сказать:во сколько раз эти векторы различаются?Давайте сравним:

(1,1,1,1,1) (1,0,1,1,0)

Хм.У них один и тот же «бит» трижды — в 1-й, 3-й и 4-й позиции.Они отличаются всего на 2 бита.Допустим, когда мы сравниваем эти два вектора, мы имеем «расстояние» 2.Поздравляем, мы только что вычислили Расстояние Хэмминга!Чем меньше расстояние Хэмминга, тем более «похожими» являются данные.

(Разница между мерой «сходства» и мерой «расстояния» заключается в том, что первая мера нормализована — она дает значение от 0 до 1.Расстояние — это просто любое число, поэтому оно дает только относительное значение.)

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

(ПС:«Классификация» - как у вас есть в своем названии - ответит на вопрос «Если вы возьмете мое предложение, в какую категорию он, скорее всего, попадет?» Что немного отличается от того, чтобы сказать: «Насколько больше похоже на мое предложение к категории 1, чем категория 2?» что кажется тем, что вам нужно.)

удачи!

Другие советы

Основными характеристиками проблемы являются:

  • Внешние критерии категоризации (список ключевых слов)
  • Классифицируемые элементы (строки из документа с требованиями) состоят из относительно небольшого количества значений атрибутов, фактически для одного измерения:"ключевое слово".
  • Как определено, нет обратной связи/калибровки (хотя, возможно, было бы уместно предложить что-то из этого)

Эти характеристики приносят как хорошие, так и плохие новости:реализация должна быть относительно простой, но последовательного уровня точности процесса категоризации может быть трудно достичь.Кроме того, небольшое количество различных величин (количество возможных категорий, максимальное/среднее количество слов в элементе и т. д.) должно дать нам возможность выбирать решения, которые могут быть ориентированы на процессор и/или пространство, если это необходимо.

Тем не менее, даже несмотря на то, что эта лицензия стала «модной», я предлагаю начать (и оставаться рядом) с простой алгоритм и чтобы тратить на этой основе с некоторыми дополнениями и соображениями, сохраняя при этом бдительность в отношении всегда существующей опасности, называемой переоснащением.

Основной алгоритм (Концептуальный, т.е.на данный момент не фокусируюсь на трюках с производительностью)

   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.

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

Теперь на ум приходят несколько простых улучшений:(Я бы серьезно рассмотрел первые два и подумал над остальными;решение по каждому из них во многом зависит от масштаба проекта, статистического профиля данных, подлежащих классификации, и других факторов...)

  • Мы должны нормализовать ключевые слова, считываемые из входных элементов, и/или сопоставлять их таким образом, чтобы не допустить ошибок в написании.Поскольку у нас так мало слов для работы, нам нужно убедиться, что мы не потеряем важное слово из-за глупой опечатки.
  • Нам следует уделять больше внимания словам, которые реже встречаются в CatKW.Например, слово «Счет» должно быть меньше, чем слово «foo» или «кредит».
  • Мы могли бы (но, возможно, это не будет полезно или даже полезно) придать больший вес рейтингам элементов, в которых меньше [нешумовых] слов.
  • Мы могли бы также включить рассмотрение, основанное на биграммах (два последовательных слова), поскольку в естественных языках (а документы с требованиями не совсем естественны :-)) близость слов часто является более сильным индикатором, чем сами слова.
  • мы могли бы добавить немного важности к категории, назначенной предыдущему (или даже следующему, в упреждающей логике) элементу.Скорее всего, товар появится в связанных сериях, и мы сможем извлечь выгоду из этой регулярности.

Также, помимо расчета рейтинга как такового, следует учитывать:

  • некоторые метрики, которые будут использоваться для оценки самого результата алгоритма (подлежит уточнению)
  • некоторая логика для сбора списка слов, связанных с присвоенной категорией, и в конечном итоге для сбора статистики по ним.Это может позволить идентифицировать слова, представляющие категорию и изначально не указанные в CatKW.

Вопрос о метриках следует рассмотреть заранее, но для этого также потребуется эталонный набор входных элементов:своего рода «обучающий набор», даже несмотря на то, что мы отрабатываем заранее определенные словарные ключевые слова-категории (обычно обучающие наборы используются для определения этого самого списка ключевых слов-категории вместе с весовым коэффициентом).Конечно, такой эталонный/обучающий набор должен быть как статистически значимым, так и статистически репрезентативным [всего набора].

Обобщить: придерживаться простые подходы, В любом случае контекст не оставляет места для фантазии.Рассмотрите возможность введения способ измерения эффективности конкретных алгоритмов (или определенных параметров в рамках данного алгоритма), но помните, что такие метрики могут быть ошибочными и побуждать вас специализировать решение для данного набора в ущерб другим элементам (переоснащение).

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

# predictor algorithm
for docs in readContent:
    for x in range(len(docKywrdmppr)):
        catAccum[x]=0
    for i in range(len(docKywrdmppr)):
        for word in removeStopWords(docs):
            if word.casefold() in removeStopWords(docKywrdmppr['Keywords'][i].casefold()):
                print(word)
                catAccum[i]=catAccum[i]+counter
    print(catAccum)
    ind=catAccum.index(max(catAccum))
    print(ind)
    predictedDoc.append(docKywrdmppr['Document Type'][ind])
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top