2016-11-06 5 views
4

Я пытаюсь извлечь этот тип информации из следующей структуры пункта:NLP - извлечение информации в Python (Spacy)

women_ran men_ran kids_ran walked 
     1  2  1  3 
     2  4  3  1 
     3  6  5  2 

text = ["On Tuesday, one women ran on the street while 2 men ran and 1 child ran on the sidewalk. Also, there were 3 people walking.", "One person was walking yesterday, but there were 2 women running as well as 4 men and 3 kids running.", "The other day, there were three women running and also 6 men and 5 kids running on the sidewalk. Also, there were 2 people walking in the park."] 

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

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

ответ

7

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

Вы могли бы реализовать правила, нужно несколько различных способов - много, как, как всегда есть несколько способов, чтобы написать запрос XPath, селектор DOM и т.д.

Что-то, как это должно работать:

nlp = spacy.load('en') 
docs = [nlp(t) for t in text] 
for i, doc in enumerate(docs): 
    for j, sent in enumerate(doc.sents): 
     subjects = [w for w in sent if w.dep_ == 'nsubj'] 
     for subject in subjects: 
      numbers = [w for w in subject.lefts if w.dep_ == 'nummod'] 
      if len(numbers) == 1: 
       print('document.sentence: {}.{}, subject: {}, action: {}, numbers: {}'.format(i, j, subject.text, subject.head.text, numbers[0].text)) 

Для ваших примеров в text вы должны получить:

document.sentence: 0.0, subject: men, action: ran, numbers: 2 
document.sentence: 0.0, subject: child, action: ran, numbers: 1 
document.sentence: 0.1, subject: people, action: walking, numbers: 3 
document.sentence: 1.0, subject: person, action: walking, numbers: One 
+0

Я никогда не писал запрос XPath или селектор DOM. Не могли бы вы объяснить, пожалуйста? – kathystehl

+1

@kathystehl XPath указывает местоположение в документе XML (HTML). Таким образом, запрос XPath - это способ найти определенный элемент в XML или HTML. См. [Wikpedia] (https://en.wikipedia.org/wiki/XPath). Селектор DOM - это любой элемент CSS 'id' или' class' в документе HTML (DOM - это структура данных для HTML/XML-документа/дерева, с которым вы работаете в javascript, и т. Д.). Таким образом, вы можете фильтровать по id и классу для поиска элементов. В NLP анализатор зависимостей превращает неструктурированный текст в структуру древовидных данных, похожую на HTML, с тегами, которые могут быть запрошены подобным образом с помощью фильтров DOM-селектора и запросов XPath. – hobs