使用Regex和POS提取名词和实体

时间:2015-10-08 10:47:05

标签: python regex nlp

我不是python的专家,我只是尝试了几种算法。

我有一个句子,例如,

"The maker of Sam Global Ent, Sam Helsen has bought many stocks in a private intelligence firm Samligence."

我试图使用POS标记器获取所有名词,但是,如果成功实体以大写字母开头,则应将其视为一个实体。

例如:“Sam Global Ent”应被视为一个实体。

我正在寻找的输出如下:

[u'maker',                     --  Noun
 u'Sam Global Ent',            --  Considered as one entity
 u'Sam Helsen',                --  Considered as one entity
 u'stocks',                    --  Noun
 u'intelligence',              --  Noun
 u'firm',                      --  Noun 
 u'Samligence']                --  Noun/entity

我已经编写了代码来单独完成这项工作,但我不知道如何以高效的方式将它们组合起来。

到目前为止我写的代码是..

用于提取以大写字母开头的后续实体:

find_entities=re.findall(r'\b[A-Z]\w+(?:\s\b[A-Z]\w+)*', sentences, re.DOTALL)

输出:

find_entities= ['The', 'Sam Global Ent', 'Sam Helsen', 'Samligence']

用于提取所有名词:

words=word_tokenize(sentences.decode('utf-8'))
    for pos in pos_tag(words):
        if 'NN' in pos[1]:
            entity_nouns.append(pos[0])

输出:

 entity_nouns=
[u'maker',
 u'Sam',
 u'Global',
 u'Ent',
 u'Sam',
 u'Helsen',
 u'stocks',
 u'intelligence',
 u'firm',
 u'Samligence']

我想过像十字路口这样的方法。例如,将“find_entities”分解为单个元素(['The','Sam','Global','Ent','Sam','Helsen','Samligence']),然后将其减去entity_nouns然后添加结果再次找到find_entities。但这似乎是一个漫长的过程。

如果有人能帮助我,我会很高兴。

2 个答案:

答案 0 :(得分:2)

考虑一个简单的方法:您已经将句子标记为单词。不是使用正则表达式来查找实体,只需对单词列表进行一次迭代,然后组合以大写字母开头的列表中的连续单词。

答案 1 :(得分:1)

你试过TextBlob吗?它提取名词短语:

>>> from textblob import TextBlob
>>> txt = """The maker of Sam Global Ent, Sam Helsen has bought many stocks in a private intelligence firm Samligence."""
>>> blob = TextBlob(txt)
>>> blob.noun_phrases
WordList([u'sam global ent', u'sam helsen', u'private intelligence firm', 'samligence'])