在上一篇<NLTK基础 | 一文轻松使用NLTK进行NLP任务(附视频)>中,简单介绍了NLTK的安装和使用。大家都知道命名实体识别作为NLP几大基础任务之一,在工业界应用也是非常广泛。那么NLTK包能不能进行命名实体识别呢?下面将详细介绍NLTK如何出色的完成命名实体识别任务!
命名实体识别作为自然语言处理的子任务之一,旨在通过算法能够自动的识别出一句话中的实体,比如人物、地点、物品、时间、数字等等。
NLTK包中内置命名实体识别算法,主要分为两种:(1) 识别句子中所有命名实体;(2) 将命名实体识别为它们各自的类型,例如人物,地点,位置等。
这里举一个例子:
import nltkfrom nltk.corpus import state_unionfrom nltk.tokenize import PunktSentenceTokenizer
train_text = state_union.raw("2005-GWBush.txt")sample_text = state_union.raw("2006-GWBush.txt")
custom_sent_tokenizer = PunktSentenceTokenizer(train_text)tokenized = custom_sent_tokenizer.tokenize(sample_text)
def process_content(document): words = nltk.word_tokenize(document) tagged = nltk.pos_tag(words) namedEnt = nltk.ne_chunk(tagged, binary=True) return namedEnt
namedEnt = process_content(tokenized[6])
在这里,当binary=True
,这意味着某物是命名实体,还是不是。没有进一步的细节。结果是:
如果将binary=False
,则结果为:
随即,您可以看到一些内容。当binary=False
时,它将采用相同的方法,但最终将像"White House"这样的术语拆分为"White"和"House",就好像它们是不同的一样,而我们可以在binary=True
选项中看到命名实体识别中"White House"是同一个实体的一部分是正确的。
根据你的目标,可以按照自己的意愿使用binary
选项。如果binary=False
,则可以得到以下命名实体的类型(ps:这是binary=True所不具备的):
named_entities = []for tagged_tree in namedEnt: if hasattr(tagged_tree, 'label'): entity_name = ' '.join(c[0] for c in tagged_tree.leaves()) entity_type = tagged_tree.label() named_entities.append((entity_name, entity_type)) named_entities = list(set(named_entities)) entity_frame = pd.DataFrame(named_entities, columns=['Entity Name', 'Entity Type'])print(entity_frame) 输出结果为: Entity Name Entity Type0 House ORGANIZATION1 White FACILITY2 Eric PERSON
无论哪种方式,你都可能会发现需要做更多的工作才能使其性能更好,但是,NLTK开箱即用,这是非常强大的,值得夸奖的!
以上就简单的介绍了NLTK在命名实体识别任务的用途!希望小伙伴们喜欢!