Nano Hash - криптовалюты, майнинг, программирование

Различать список между человеческими именами и названиями компаний

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

С помощью онлайн-исследований я попробовал два способа. Первый использует nltk. Мой код выглядит так

y = ['INOVATIA LABORATORIES LLC', 'PRULLAGE PHD JOSEPH B', 'S J SMITH CO INC', 'TEVA PHARMACEUTICALS USA INC', 'KENT NUTRITION GROUP INC', 'JOSEPH D WAGENKNECHT', 'ROBERTSON KEITH', 'LINCARE INC', 'AGCHOICE - BLUE MOUND']

В приведенном выше списке я хотел бы удалить PRULLAGE PHD JOSEPH B, JOSEPH D WAGENKNECHT и ROBERTSON KEITH.

z = []
for company in y:
    tokens = nltk.tokenize.word_tokenize(company)
    z.append(nltk.pos_tag(tokens))

Это не работает, потому что все помечается как имя собственное. Затем я перевел все в нижний регистр и сделал только первую букву каждого слова прописной, используя .title(), но это также не удалось по тем же причинам.

Другой метод, который я пробовал, заключался в использовании модуля Human Name Parser, но он также не сработал, потому что он помечает названия компаний как имя и фамилию человека.

Есть ли способ, которым я могу различать приведенный выше список между человеческими именами и названиями компаний?

02.08.2016

  • это список? если это так, вам не хватает запятых, и ваши кавычки не в порядке 02.08.2016
  • Больше похоже на проблему машинного обучения. Как вы ожидаете, что NLTK будет знать определение компании? Вы должны сказать, что (INC, LLC, CO, GROUP) — это все ключевые слова. 02.08.2016
  • Моя вина, что я сделал это правильный список. 02.08.2016
  • Машинное обучение? К сожалению, я ничего не знаю о машинном обучении, и я слышал, что существует большая кривая обучения. :( 02.08.2016
  • Ага, извини. NLTK хорош для фраз, слов и т. д., но вам нужна дополнительная логика, чтобы применять любые решения к этим данным. 02.08.2016
  • Это никогда не будет работать на 100% со случайными данными. Есть названия компаний, которые неотличимы от имен людей. Например, недавно я купил рубашку от компании Tori Richards. Учитывая имя Элис Марина, это имя человека по имени Алиса с фамилией Марина, или имя компании Элис Марина, которая предоставляет место для хранения вашей лодки? 02.08.2016
  • Я думаю, что это похоже на проблему неоднозначности смысла слова 02.08.2016
  • @cricket_007 на самом деле, nltk знает о компаниях. tokenized = nltk.word_tokenize(INOVATIA LABORATORIES LLC.title()) nltk.pos_tag(tokenized) namedEnt = nltk.ne_chunk(tagged) print(namedEnt) будет отображать S (GPE Inovatia/NNP) (ОРГАНИЗАЦИЯ Laboratories/NNPS Llc/NNP) ) 03.08.2016
  • @psoucy Ваш код комментария трудно прочитать. Вы более чем можете дать ответ, хотя 03.08.2016
  • @cricket_007 извините за формат, не знаю, как отформатировать код в комментарии. Я не публикую в качестве ответа, потому что это не решит проблему. NLTK в целом (и тем более распознавание именованных сущностей) лучше всего работает с произвольным текстом, но не так хорошо с такими короткими фразами. 03.08.2016
  • 3 года спустя, и ни один из этих ответов не получил балла? Ну, я нашел их полезными, поэтому я дал их каждому. 24.05.2019

Ответы:


1

Я не верю, что вы можете сделать это полностью программно, поэтому потребуется некоторая ручная операция. Однако вы можете упростить задачу с помощью itertools.groupby.

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

key_words = ["INC", "LLC", "CO", "GROUP"]

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

y.sort(key=lambda name: any(key_word in name for key_word in key_words))    

В вашем примере это будет список

['PRULLAGE PHD JOSEPH B', 'JOSEPH D WAGENKNECHT', 'ROBERTSON KEITH', 'AGCHOICE - BLUE MOUND', 'INOVATIA LABORATORIES LLC', 'S J SMITH CO INC', 'TEVA PHARMACEUTICALS USA INC', 'KENT NUTRITION GROUP INC', 'LINCARE INC']

Отсюда мы можем сгруппировать вещи, которые вероятно не являются компаниями (те, которые не содержат ключевых слов), и вещи, которые определенно являются компаниями (те, которые содержат ключевые слова):

import itertools
I = itertools.groupby(y, lambda name: any(key_word in name for key_word in key_words))

Итак, у нас есть две группы:

for i in I:
    print i[0], list(i[1])
False ['PRULLAGE PHD JOSEPH B', 'JOSEPH D WAGENKNECHT', 'ROBERTSON KEITH', 'AGCHOICE - BLUE MOUND']
True ['INOVATIA LABORATORIES LLC', 'S J SMITH CO INC', 'TEVA PHARMACEUTICALS USA INC', 'KENT NUTRITION GROUP INC', 'LINCARE INC']

Затем вы можете вручную отсортировать ложную группу и удалить компании или применить другой аналогичный метод фильтрации для дальнейшего улучшения соответствия. Некоторые другие фильтры для применения:

  • Все, что содержит "MR", "MS", "MRS", "PHD", "DR", скорее всего, является человеком.
  • Слова в форме "multiple_letters<space>single_letter<space>multiple_letters", вероятно, являются именами, вы можете сделать это сопоставление с re
02.08.2016
  • Ошибка в строке с функцией сортировки TypeError: must use keyword argument for key function 02.08.2016
  • Исправлена ​​ошибка путем добавления key = lambda, но функция сортировки, вероятно, в этом случае не сортирует. Он создает группы key_words для сортировки, но не создает одну большую группу для каждой. 02.08.2016
  • @Jstuff, исправил опечатку. Не уверен, что понимаю ваш вопрос, что вы, вероятно, подразумеваете под сортировкой. Когда я запускаю код, я получаю результат, показанный в ответе. 02.08.2016
  • Действительно, если не использовать подход машинного обучения, это кажется достаточно сильной эвристикой, особенно если вам не нужен действительно точный вывод. 03.08.2016

  • 2

    Насколько я понимаю, нужно различать фирменные и человеческие имена. Я предполагаю, что компании в вашем списке заканчиваются либо на LLC, INC, либо содержат - (дефис), поэтому я составил набор этих слов company_set как {'LLC', 'INC', '-'}, а затем разделить его на токены с помощью базовой функции split(). Если пересечение company_set и разделенных токенов имеет что-то общее, то это не будет пустым набором, поэтому сообщение компании печатается, иначе сообщение человека. Ниже приведен код:

    y = ['INOVATIA LABORATORIES LLC', 'PRULLAGE PHD JOSEPH B', 'S J SMITH CO INC', 'TEVA PHARMACEUTICALS USA INC', 'KENT NUTRITION GROUP INC', 'JOSEPH D WAGENKNECHT', 'ROBERTSON KEITH', 'LINCARE INC', 'AGCHOICE - BLUE MOUND']
    company_set = {'LLC', 'INC', '-'}
    for item in y:
        tokens = set(item.split())
        if company_set.intersection(tokens) !=  set():
            print "{} is a company".format(item)
        else:
            print "{} is a human".format(item)
    

    И выводит следующим образом:

    INOVATIA LABORATORIES LLC is a company
    PRULLAGE PHD JOSEPH B is a human
    S J SMITH CO INC is a company
    TEVA PHARMACEUTICALS USA INC is a company
    KENT NUTRITION GROUP INC is a company
    JOSEPH D WAGENKNECHT is a human
    ROBERTSON KEITH is a human
    LINCARE INC is a company
    AGCHOICE - BLUE MOUND is a company
    
    02.08.2016
  • Если у вас есть человек с фамилией Inc, это не удастся. Необычно, но не невозможно. 02.08.2016
  • Интересный подход, но не все мои компании заканчиваются на ООО, ИНК и т.д. У меня довольно большой список компаний. 02.08.2016
  • Я повторно ответил на ваш вопрос. 02.08.2016
  • В общем, мы также должны добавить числа и символы [кроме . и ,] поскольку они не могут встречаться в именах 03.08.2016

  • 3

    Протестируйте элементы списка на наличие показателей названий компаний. В вашем списке это INC, LLC и дефис (который может быть частью имени человека). Или части названия компании (лаборатория, фарма, решения, ..). Могут быть и другие критерии (слоги, фонетика). В противном случае вам понадобится словарь имен или компаний для проверки.

    y = ['INOVATIA LABORATORIES LLC', 'PRULLAGE PHD JOSEPH B', 'S J SMITH CO INC', 'TEVA PHARMACEUTICALS USA INC', 'KENT NUTRITION GROUP INC', 'JOSEPH D WAGENKNECHT', 'ROBERTSON KEITH', 'LINCARE INC', 'AGCHOICE - BLUE MOUND']
    f = ["INC", "LLC", "-"]
    c = []
    for n in y:
      for t in f:
        if t in n:
          c.append(n)
    print( "\n".join(c) )
    

    дает

    > t
    INOVATIA LABORATORIES LLC
    S J SMITH CO INC
    TEVA PHARMACEUTICALS USA INC
    KENT NUTRITION GROUP INC
    LINCARE INC
    AGCHOICE - BLUE MOUND
    
    02.08.2016
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

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