извлечь имя объекта из неструктурированных данных - PullRequest
0 голосов
/ 26 сентября 2018

У меня очень неструктурированные данные, и я хочу извлечь из них полное имя.Данные примерно такие

txt = " 663555 murphy rd suite 106 richardson tx 7508 usa 111 it park indore 452 010 india ph 91 987 4968420 123456789 sumeetlogikviewcom  Nirali Khoda cofounder analytics pvt ltd ideata  a comprehensive data analytics platform"

text = "dicictay  8 8 8 bf infotech pvt ltd manager infotech pvt ltd  redefining technologies 91 12345 12345 zoeb fatemi "

Я пробовал spacy и standfordNER, но он не дает хороших результатов.Это дает мне имя по адресу, подобному этому

en = spacy.load('en_core_web_md')

txt = txt.title().strip()

sents = en(txt)

people = [ee for ee in sents.ents if ee.label_ == 'PERSON']

На выходе это:

[663555 Murphy Rd Suite, Analytics Pvt Ltd Ideata]

Ожидаемый результат:

[Nirali Khoda]

Помощь будет принята с благодарностью.Спасибо :)

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

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

0 голосов
/ 26 сентября 2018

Прежде чем начать, я хочу упомянуть, что вместо этого я использовал spacy.load("en_core_web_lg") для своего кода - это, по-видимому, довольно существенно влияет на результаты синтаксического анализа, так что это может быть первоначальным подходом к вашей проблеме.У меня также не было запущенной установки StanfordNER локально, поэтому вместо этого я использовал предоставленный веб-интерфейс .

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

Iтакже проанализировал первое предложение с SpaCy и получил следующий результат при просмотре распознанных сущностей:

663555 DATE
106 Richardson PERSON
Tx GPE
7508 DATE
Usa GPE
111 CARDINAL
Park Indore GPE
452 010 CARDINAL
India GPE
91 CARDINAL
987 CARDINAL
123456789 DATE
Sumeetlogikviewcom PERSON
Nirali Khoda Cofounder Analytics Pvt Ltd Ideata ORG
Comprehensive Data Analytics Platform ORG

Как мы видим, проблема здесь двоякая: не только экземпляр с вашим именемв нем неправильно обозначено (ORG вместо PERSON), но это также показывает, что первоначальное разделение на разные объекты проблематично.

Я предполагаю, что у вас есть какой-то способ доступа к конвейеру извлечения данных, ине "вслепую" брать их откуда-то еще.Это особенно важно, чтобы вы могли ввести некоторую форму разделения между различными контейнерами;Хотя большинство препроцессоров имеют некоторую форму (которая удаляет HTML-теги и «объединяет» их), некоторая форма разделения может вам пригодиться: я немного изменил ваш ввод следующего:

txt = " 663555 murphy rd suite 106 richardson tx 7508 usa , 111 it park indore 452 010 india ph 91 987 4968420 123456789 , sumeetlogikviewcom ,  Nirali Khoda , cofounder analytics pvt ltd , ideata  a comprehensive data analytics platform"

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

663555 DATE
106 Richardson PERSON
Tx GPE
7508 DATE
Usa GPE
111 CARDINAL
Park Indore GPE
452 010 CARDINAL
India GPE
91 CARDINAL
987 CARDINAL
123456789 DATE
Sumeetlogikviewcom PERSON
Nirali Khoda PERSON
Cofounder Analytics Pvt Ltd ORG
Ideata   ORG

На этот раз результат как правильно разделен, так и (более) правильно классифицирован.Очевидно, что вы все еще не получаете идеальных результатов, но это редко случается с NER.

Если вы хотите распознавать только имена, вы также можете «вручную анализировать» их, независимо от базовых объектов, с болеегрубый подход: вы можете захотеть, чтобы SpaCy или CoreNLP разделяли различные сущности, а затем - независимо от фактического тега - проверять для каждого объекта, содержит ли он токен, который содержится в наборе общих имен / фамилий (данных дляСША, например, можно найти здесь ).Я уверен, что существуют более полные списки, и это может быть хорошей заменой, если вы буквально ищете только имена.Конечно, это вряд ли идеально решит и вашу проблему (вспомните Тойоту, которая, кстати, также очень распространенная фамилия на японском языке, или что-то вроде мистера Проппера, который (для компьютера) вполне может быть «человеком»"также).

...