Извлечение / разбор сочетаний местоимений-местоимений и глаголов-существительных / местоимений в предложении - PullRequest
0 голосов
/ 28 сентября 2018

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

text = "Civil, Mechanical, and Industrial Engineering majors are preferred."

Я хочу извлечь следующее изэтот текст:

Civil Engineering
Mechanical Engineering
Industrial Engineering

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

Попытки :
1. Я изучил spacy анализ зависимостей , но отношения родитель-потомок не отображаются между каждым типом Engineering (Civil,Машиностроение, Промышленность) и слово Машиностроение.

import spacy

nlp = spacy.load('en_core_web_sm')
doc = nlp(u"Civil, Mechanical, and Industrial Engineering majors are preferred.")

print( "%-15s%-15s%-15s%-15s%-30s" % ( "TEXT","DEP","HEAD TEXT","HEAD POS","CHILDREN" ) )
for token in doc:
    if not token.text in ( ',','.' ):
        print( "%-15s%-15s%-15s%-15s%-30s" % 
          ( 
              token.text 
              ,token.dep_
              ,token.head.text
              ,token.head.pos_
              ,','.join( str(c) for c in token.children )
          ) )

... вывод ...

TEXT           DEP            HEAD TEXT      HEAD POS       CHILDREN                      
Civil          amod           majors         NOUN           ,,Mechanical                  
Mechanical     conj           Civil          ADJ            ,,and                         
and            cc             Mechanical     PROPN                                        
Industrial     compound       Engineering    PROPN                                        
Engineering    compound       majors         NOUN           Industrial                    
majors         nsubjpass      preferred      VERB           Civil,Engineering             
are            auxpass        preferred      VERB                                         
preferred      ROOT           preferred      VERB           majors,are,.                  

Я также пытался использовать nltk pos-теги, но получаю следующее ...

import nltk nltk.pos_tag (nltk.word_tokenize (предпочтительны профили гражданского, машиностроения и промышленного строительства). '))

[('Civil', 'NNP'),
 (',', ','),
 ('Mechanical', 'NNP'),
 (',', ','),
 ('and', 'CC'),
 ('Industrial', 'NNP'),
 ('Engineering', 'NNP'),
 ('majors', 'NNS'),
 ('are', 'VBP'),
 ('preferred', 'VBN'),
 ('.', '.')]

Все типы инженерии и слово «Инжиниринг» называются NNP (собственно существительными), поэтому любой тип RegexpParser pattern IМожет думать, не работает.

Вопрос:
Кто-нибудь знает способ - в Python 3 - извлечь эти пары имен существительных?

EDIT: Примеры добавления

Следующие примеры аналогичны первому примеру, за исключением того, что это версии глагола-существительного / глагола-правильного.

text="Experience with testing and automating API’s/GUI’s for desktop and native iOS/Android"

Extract:

testing API’s/GUI’s
automation API’s/GUI’s
text="Design, build, test, deploy and maintain effective test automation solutions"

Extract:

Design test automation solutions
build test automation solutions
test test automation solutions
deploy test automation solutions
maintain test automation solutions

1 Ответ

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

Без какого-либо внешнего импорта и при условии, что списки всегда отформатированы как запятые, разделенные необязательным «и» после последнего, можно написать некоторое регулярное выражение и выполнить некоторые манипуляции со строками, чтобы получить желаемый результат:

import re

test_string = "Civil, Mechanical, and Industrial Engineering majors are preferred."
result = re.search(r"(([A-Z][a-z]+, )+(and)? [A-Z][a-z]+ ([A-Z][a-z]+))+", test_string)
group_type = result.group(4)
string_list = result.group(1).rstrip(group_type).strip()
items = [i.strip().strip('and ') + ' ' + group_type for i in string_list.split(',')]

print(items)  # ['Civil Engineering', 'Mechanical Engineering', 'Industrial Engineering']

Опять же, все это основано на узком предположении о том, как форматируется список.Вам может понадобиться изменить шаблон регулярного выражения, если есть больше возможностей.

...