代码之家  ›  专栏  ›  技术社区  ›  meow

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

  •  2
  • meow  · 技术社区  · 7 年前

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

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

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   alexis    7 年前

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

    >>> 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) 元组或a Tree() 包含块的各个部分。