NLTK 标记化但不拆分命名实体

NLTK tokenize but don't split named entities

我正在开发一个简单的基于语法的解析器。为此,我需要先标记输入。在我的文本中出现了许多城市(例如,纽约、旧金山等)。当我只使用标准 nltk word_tokenizer 时,所有这些城市都被拆分了。

from nltk import word_tokenize
word_tokenize('What are we going to do in San Francisco?')

当前输出:

['What', 'are', 'we', 'going', 'to', 'do', 'in', 'San', 'Francisco', '?']

期望的输出:

['What', 'are', 'we', 'going', 'to', 'do', 'in', 'San Francisco', '?']

如何在不拆分命名实体的情况下标记这些句子?

识别命名实体,然后遍历结果并将分块标记连接在一起:

>>> from nltk import ne_chunk, pos_tag, word_tokenize
>>> toks = word_tokenize('What are we going to do in San Francisco?')
>>> chunks = ne_chunk(pos_tag(toks))
>>> [ w[0] if isinstance(w, tuple) else " ".join(t[0] for t in w) for w in chunks ]
['What', 'are', 'we', 'going', 'to', 'do', 'in', 'San Francisco', '?']

chunks 的每个元素要么是一个 (word, pos) 元组,要么是一个 Tree() 包含块的各个部分。