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

NLTK-标记后连接专有名词

  •  2
  • user9092346  · 技术社区  · 6 年前

    我有一个句子,我首先标记,然后使用nltk标记:

    sentence = 'Ronald McDonald exercised at the Central Park on Monday.'
    
    tokens = nltk.word_tokenize(sentence)
    print(tokens)
    
    tagged = nltk.pos_tag(tokens)
    print(tagged)
    

    使用nltk。pos\u tag、Ronald、McDonald、Central、Park和Monday成为专有名词(NNP)-这是正确的。现在,我把这个句子的所有专有名词都写在另一个变量中,因为我想稍后使用它们。

    propernouns = [word for word,pos in tagged if pos == 'NNP']
    print(propernouns)
    

    现在,在我的案例中,95%的情况下,文本中任何数量的紧随其后的专有名词都属于同一类。“罗纳德·麦克唐纳”就是这样一个例子,就像“中央公园”一样。

    问题: 我如何更改“propernoons”中的代码,它在“taged”上迭代,提取所有NPP并像现在一样将它们写入变量中-但当它找到2个或更多时 (<NNP>+) 它们直接紧跟在一起,被写成一个由空格分隔的字符串。

    1 回复  |  直到 6 年前
        1
  •  1
  •   DYZ    6 年前

    使用 itertools.groupby 要将具有相同NNP标记的连续词组分组,请执行以下操作:

    from itertools import groupby
    groups = groupby(tagged, key=lambda x: x[1]) # Group by tags
    names = [[w for w,_ in words] for tag,words in groups if tag=="NNP"]
    #[['Ronald', 'McDonald'], ['Central', 'Park'], ['Monday']]
    names = [" ".join(name) for name in names if len(name)>=2] 
    #['Ronald McDonald', 'Central Park']