使用 Regex 和 POS 提取名词和实体
Extracting Nouns and Entities using Regex and POS
我不是 python 方面的专家,我只是尝试了一些算法。
我有一句话,例如,
"The maker of Sam Global Ent, Sam Helsen has bought many stocks in a private intelligence firm Samligence."
我正在尝试使用词性标注器获取所有名词,但是,如果后续实体以大写字母开头,则应将它们视为一个实体。
例如:"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。但这似乎是一个很漫长的过程。
如果有人能帮助我,我会很高兴。
考虑一种简单的方法:您已经将句子标记为单词。无需使用正则表达式方法来查找实体,只需对单词列表进行一次迭代,然后组合列表中以大写字母开头的连续单词。
你试过了吗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'])
我不是 python 方面的专家,我只是尝试了一些算法。
我有一句话,例如,
"The maker of Sam Global Ent, Sam Helsen has bought many stocks in a private intelligence firm Samligence."
我正在尝试使用词性标注器获取所有名词,但是,如果后续实体以大写字母开头,则应将它们视为一个实体。
例如:"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。但这似乎是一个很漫长的过程。
如果有人能帮助我,我会很高兴。
考虑一种简单的方法:您已经将句子标记为单词。无需使用正则表达式方法来查找实体,只需对单词列表进行一次迭代,然后组合列表中以大写字母开头的连续单词。
你试过了吗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'])