从句子中提取/解析代词-代词和动词-名词/代词组合



问题:
我正在尝试从工作描述中提取专有名词列表,如下所示。

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

我想从本文中提取以下内容:

Civil Engineering
Mechanical Engineering
Industrial Engineering

这是问题的一种情况,因此使用特定于应用程序的信息将不起作用。例如,我不能有一个专业列表,然后尝试检查这些专业名称的一部分是否与"专业"一词一起出现在句子中,因为我在其他句子中也需要这个。

尝试
1.我研究了空间依赖解析,但是每个工程类型(土木,机械,工业(和工程一词之间没有显示父子关系。

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 )
) )

。输出。。。

文本 DEP 头 文本头 POS 子项                      土木阿莫德专业名词,,机械                  机械调节 民用 ADJ ,,和                         和 cc 机械 PROPN                                        工业复合工程                                        工程复合专业 名词 工业                    专业首选 动词 土木,工程             是辅助首选动词                                         首选词根首选动词专业,是,。
  1. 我也尝试过使用 nltk pos 标记,但我得到以下结果......

    导入 NLTK nltk.pos_tag(nltk.word_tokenize(土木、机械、工业工程专业优先。

[("民事","NNP"(,  (',', ','),  ("机械","NNP"(,  (',', ','),  ("和","抄送"(,  ("工业"、"NNP"(,  ("工程","NNP"(,  ("专业","NNS"(,  ("是","VBP"(,  ("首选"、"VBN"(,  ('.', '.')]

工程类型和工程一词都是NNP(专有名词(,所以我能想到的任何类型的RegexpParser模式都不起作用。

问:
有谁知道在Python 3中提取这些名词短语配对的方法吗?

编辑:添加示例

以下示例与第一个示例类似,不同之处在于这些是动词-名词/动词-专有名词版本。

text="具有为桌面和本机 iOS/Android 测试和自动化 API/GUI 的经验" 提取: 测试 API/GUI 自动化 API/GUI 的文本
="设计、构建、测试、部署和维护有效的测试自动化解决方案" 提取: 设计测试自动化解决方案 构建测试自动化解决方案 测试测试自动化解决方案 部署测试自动化解决方案 维护测试自动化解决方案

在没有任何外部导入的情况下,假设列表始终格式化为逗号,并在最后一个列表之后用可选的"and"分隔,则可以编写一些正则表达式并进行一些字符串操作以获得所需的输出:

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']

同样,这一切都基于对列表格式的狭隘假设。如果有更多可能性,您可能需要修改正则表达式模式。

最新更新