Python - способ узнать и обнаружить текстовые шаблоны?

Проблема:

Мне дается длинный список различных наименований позиций для работы в ИТ-индустрии (поддержка или развитие); Мне нужно автоматически классифицировать их на основе общего типа работы, которую они представляют. Например, аналитик ИТ-поддержки, аналитик службы поддержки... и т.д. Все они могут принадлежать группе IT-поддержки.

Текущий подход:

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

"(HELP | SERVICE) DESK"

чтобы соответствовать заданиям типа поддержки IT, и это в конечном итоге стало:

"(ПОМОЩЬ | ПОДДЕРЖКА | СЕРВИС) (DESK | ANALYST)"

что было еще более инклюзивным.

Вопрос:

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

EDIT:

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

(Сервис) → (Стол) → (Поддержка) ИЛИ → (Аналитик)... где Поддержка и аналитик являются детьми Desk

Скажем, я получаю строку "Level-1 Service Desk Analyst"... Это должно быть категоризировано с использованием дерева решений выше, но оно не будет соответствующим образом соответствовать дереву (так как нет корня node с именем "Уровень" ) или "Уровень-1" ).

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

  • Аналитик службы поддержки ИТ
  • Аналитик службы поддержки уровня 1
  • Поддержка службы поддержки компьютеров

Я бы хотел, чтобы мой алгоритм создал что-то вроде ниже:

(Служба или Справка) → (Стол) → (Поддержка аналитика ИЛИ)... где Служба и Справка являются корневыми узлами, и оба аналитика и поддержки являются дочерними элементами Desk

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

Если я не буду достаточно ясен, просто дайте мне знать!

Ответ 1

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

Я решил пойти с модулем Pattern для Python, использовать классификатор Naive-Bayes.

Поскольку пользователь вручную классифицирует позиции, файл csv генерируется по одной строке за раз:

"Аналитик службы поддержки", "Служба поддержки" "Служба поддержки" , "Служба поддержки" , "Jr. Java Developer", "Java Development" ... и т.д.

Мой алгоритм выглядит так (взято из http://www.clips.ua.ac.be/pages/pattern-vector#classification):

>>> from pattern.vector import Document, NB
>>> from pattern.db import csv
>>>  
>>> nb = NB()
>>> for review, rating in csv('reviews.csv'):
>>>     v = Document(review, type=int(rating), stopwords=True) 
>>>     nb.train(v)
>>> 
>>> print nb.classes
>>> print nb.classify(Document('A good movie!'))

... Где отзыв и рейтинг position_text и position_group соответственно. Данные классификатора сохраняются от одного поиска (и выполнения программы) до следующего.

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

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

Ответ 2

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

ИЗМЕНИТЬ

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

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

HELP,DESK - IT-Support
SERVICE,DESK,ANALYST - IT-Support
SALES,REPRESENTATIVE - Sales
...

Где слева от дефиса есть функции, справа - метка класса.

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

Вы можете, вероятно, использовать реализацию дерева решений из scikit-learn.

Ответ 3

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

Если бы это был я, у меня возникло бы желание создать представление стилей в виде суммирования слов и запустить общий алгоритм кластеризации (k-означает, скажем), чтобы узнать, что получилось. Выбор категории для назначения новой строки - это довольно простая операция сопоставления (в зависимости от того, что вы используете для кластеризации).

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

Ответ 4

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

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

Например:

ListOfTitles = ['a','b','c','q']
KnownSalesTitles = ['s','q','r']
KnownSupportTitles = ['a','c']
SalesFragments = ['x','y','z']
SupportFragments = ['r','s','t']
for title in ListOfTitles:
  if (title in KnownSalesTitles):
    salesFunction(title)
  elif (title in KnownSupportTitles):
    supportFunction(title)
  else:
    salescount = 0
    supportcount = 0
    for word in title.split(' '):
      if word in SalesFragments:
        salescount++
      if word in SupportFragments:
        supportcount++
    if (salescount > supportcount):
      KnownSalesTitles.append(title)
      salesFunction(title)
    else:
      KnownSupportTitles.append(title)
      supportFunction(title)

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

Просто мысль...

Ответ 5

Были предложения о неконтролируемом обучении, но я рекомендую использовать контролируемое обучение, поэтому вы будете классифицировать 100-200 позиций вручную, а затем algo сделает все остальное.

Существует множество ресурсов, библиотек и т.д. - посмотрите в книге "Программирование коллективного интеллекта" - они предоставили хорошие темы машинного обучения с примерами python.

Ответ 6

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