python中标记语料库的提取

python中标记语料库的提取,python,nlp,nltk,Python,Nlp,Nltk,嗨,我正在尝试从标记的语料库中提取专有名词,比如说,从nltk标记的语料库中,我正在尝试提取只标记了“NP”的单词 我的代码: import nltk from nltk.corpus import brown f = brown.raw('ca01') print nltk.corpus.brown.tagged_words() w=[nltk.tag.str2tuple(t) for t in f.split()] print w 但它并没有显示istead这个词,

嗨,我正在尝试从标记的语料库中提取专有名词,比如说,从nltk标记的语料库中,我正在尝试提取只标记了“NP”的单词

我的代码:

  import nltk
  from nltk.corpus import brown
  f = brown.raw('ca01')
  print nltk.corpus.brown.tagged_words()
  w=[nltk.tag.str2tuple(t) for t in f.split()]
  print w
但它并没有显示istead这个词,它只显示了istead这个词

[]

样本输出:

    [('The', 'AT'), ('Fulton', 'NP-TL'), ...]
    []
为什么呢

谢谢

我只做了一次分离,然后我得到了

             [('The', 'AT'), ('Fulton', 'NP-TL'), ('County', 'NN-TL'), ('Grand', 'JJ-TL'), ('Jury', 'NN-TL'), ('said', 'VBD'), ('Friday', 'NR'), ('an', 'AT'), ('investigation', 'NN'), ('of', 'IN'), ("Atlanta's", 'NP$'), ('recent', 'JJ'), ('primary', 'NN'), ('election', 'NN'), ('produced', 'VBD'), ('``', '``'), ('no', 'AT'), ('evidence', 'NN'), ("''", "''"), ('that', 'CS'), ('any', 'DTI'), ('irregularities', 'NNS'), ('took', 'VBD'), ('place', 'NN'), ('.', '.'), ('The', 'AT'), ('jury', 'NN'), ('further', 'RBR'), ('said', 'VBD'), ('in', 'IN'), ('term-end', 'NN'), ('presentments', 'NNS'), ('that', 'CS'), ('the', 'AT'), ('City', 'NN-TL').....

你可以想象,
t.split('/')[1]=='NP'
的计算结果总是错误的。

你可以想象,
t.split('/')[1]=='NP'
的计算结果总是错误的。

你真的不能从你给我们的东西中分辨出来,但是你试过一步一步地研究这个问题吗?似乎在任何情况下,
t.split('/')[1]=='NP'
的计算结果都不是真的。因此,你应该从以下几点开始:

  • 打印/调试以查看
    f.split()确切包含的内容
  • 确保您的条件实际上是正确的,从您提供的输出的小样本来看,我认为您更需要的是:
    如果t.split('/')[1].startswith('NP')
    ,但实际上无法判断
  • 编辑:

    好的,首先,如果这是
    f.split()
    打印给您的内容,那么您应该得到一个异常,因为
    t
    是一个元组,而元组没有
    split()
    方法。所以你让我好奇,我安装了
    nltk
    ,下载了“brown”语料库并尝试了你的代码。首先,如果我这样做了:

      import nltk
      from nltk.corpus import brown
      f = brown.raw('ca01')
      print f.split()
    
      ['The/at', 'Fulton/np-tl', 'County/nn-tl', 'Grand/jj-tl', 'Jury/nn-tl', 'said/vbd', 'Friday/nr', 'an/at', 'investigation/nn', 'of/in', "Atlanta's/np$", 'recent/jj', 'primary/nn', 'election/nn', 'produced/vbd', '``/``', 'no/at', 'evidence/nn', "''/''", 'that/cs', 'any/dti', 'irregularities/nns', 'took/vbd', 'place/nn', './.', 'The/at', 'jury/nn', 'further/rbr', 'said/vbd', 'in/in', 'term-end/nn', 'presentments/nns', 'that/cs', 'the/at', 'City/nn-tl', 'Executive/jj-tl', 'Committee/nn-tl', ',/,', 'which/wdt', 'had/hvd', 'over-all/jj', 'charge/nn', 'of/in', 'the/at', 'election/nn', ',/,', '``/``', 'deserves/vbz', 'the/at', 'praise/nn', 'and/cc', 'thanks/nns', 'of/in', 'the/at', 'City/nn-tl' .....]
    
    所以我不知道你在那里做了什么来得到结果,但这是不正确的。现在,您可以从组中看到,单词的第二部分是小写的,这就是代码失败的原因。因此,如果你这样做:

    w=[nltk.tag.str2tuple(t) for t in f.split() if t.split('/')[1].lower() == 'np']
    
    这将得到以下结果:

    [('September-October', 'NP'), ('Durwood', 'NP'), ('Pye', 'NP'), ('Ivan', 'NP'), ('Allen', 'NP'), ('Jr.', 'NP'), ('Fulton', 'NP'), ('Atlanta', 'NP'), ('Fulton', 'NP'), ('Fulton', 'NP'), ('Jan.', 'NP'), ('Fulton', 'NP'), ('Bellwood', 'NP'), ('Alpharetta', 'NP'), ('William', 'NP'), ('B.', 'NP'), ('Hartsfield', 'NP'), ('Pearl', 'NP'), ('Williams', 'NP'), ('Hartsfield', 'NP'), ('Aug.', 'NP'), ('William', 'NP'), ('Berry', 'NP'), ('Jr.', 'NP'), ('Mrs.', 'NP'), ('J.', 'NP'), ('M.', 'NP'), ('Cheshire', 'NP'), ('Griffin', 'NP'), ('Opelika', 'NP'), ('Ala.', 'NP'), ('Hartsfield', 'NP'), ('E.', 'NP'), ('Pelham', 'NP'), ('Henry', 'NP'), ('L.', 'NP'), ('Bowden', 'NP'), ('Hartsfield', 'NP'), ('Atlanta', 'NP'), ('Jan.', 'NP'), ('Ivan', 'NP'), ....]
    

    现在,为了将来的参考,在你发布像我要求的那样的信息之前,请仔细检查,因为如果信息不正确,那么它就是误导,对那些试图帮助你的人和你自己都没有帮助。不是作为一个批评家,而是作为建设性的建议:)

    不能真正从你给我们的东西中辨别出来,但你是否尝试过一步一步地研究这个问题?似乎在任何情况下,
    t.split('/')[1]=='NP'
    的计算结果都不是真的。因此,你应该从以下几点开始:

  • 打印/调试以查看
    f.split()确切包含的内容
  • 确保您的条件实际上是正确的,从您提供的输出的小样本来看,我认为您更需要的是:
    如果t.split('/')[1].startswith('NP')
    ,但实际上无法判断
  • 编辑:

    好的,首先,如果这是
    f.split()
    打印给您的内容,那么您应该得到一个异常,因为
    t
    是一个元组,而元组没有
    split()
    方法。所以你让我好奇,我安装了
    nltk
    ,下载了“brown”语料库并尝试了你的代码。首先,如果我这样做了:

      import nltk
      from nltk.corpus import brown
      f = brown.raw('ca01')
      print f.split()
    
      ['The/at', 'Fulton/np-tl', 'County/nn-tl', 'Grand/jj-tl', 'Jury/nn-tl', 'said/vbd', 'Friday/nr', 'an/at', 'investigation/nn', 'of/in', "Atlanta's/np$", 'recent/jj', 'primary/nn', 'election/nn', 'produced/vbd', '``/``', 'no/at', 'evidence/nn', "''/''", 'that/cs', 'any/dti', 'irregularities/nns', 'took/vbd', 'place/nn', './.', 'The/at', 'jury/nn', 'further/rbr', 'said/vbd', 'in/in', 'term-end/nn', 'presentments/nns', 'that/cs', 'the/at', 'City/nn-tl', 'Executive/jj-tl', 'Committee/nn-tl', ',/,', 'which/wdt', 'had/hvd', 'over-all/jj', 'charge/nn', 'of/in', 'the/at', 'election/nn', ',/,', '``/``', 'deserves/vbz', 'the/at', 'praise/nn', 'and/cc', 'thanks/nns', 'of/in', 'the/at', 'City/nn-tl' .....]
    
    所以我不知道你在那里做了什么来得到结果,但这是不正确的。现在,您可以从组中看到,单词的第二部分是小写的,这就是代码失败的原因。因此,如果你这样做:

    w=[nltk.tag.str2tuple(t) for t in f.split() if t.split('/')[1].lower() == 'np']
    
    这将得到以下结果:

    [('September-October', 'NP'), ('Durwood', 'NP'), ('Pye', 'NP'), ('Ivan', 'NP'), ('Allen', 'NP'), ('Jr.', 'NP'), ('Fulton', 'NP'), ('Atlanta', 'NP'), ('Fulton', 'NP'), ('Fulton', 'NP'), ('Jan.', 'NP'), ('Fulton', 'NP'), ('Bellwood', 'NP'), ('Alpharetta', 'NP'), ('William', 'NP'), ('B.', 'NP'), ('Hartsfield', 'NP'), ('Pearl', 'NP'), ('Williams', 'NP'), ('Hartsfield', 'NP'), ('Aug.', 'NP'), ('William', 'NP'), ('Berry', 'NP'), ('Jr.', 'NP'), ('Mrs.', 'NP'), ('J.', 'NP'), ('M.', 'NP'), ('Cheshire', 'NP'), ('Griffin', 'NP'), ('Opelika', 'NP'), ('Ala.', 'NP'), ('Hartsfield', 'NP'), ('E.', 'NP'), ('Pelham', 'NP'), ('Henry', 'NP'), ('L.', 'NP'), ('Bowden', 'NP'), ('Hartsfield', 'NP'), ('Atlanta', 'NP'), ('Jan.', 'NP'), ('Ivan', 'NP'), ....]
    

    现在,为了将来的参考,在你发布像我要求的那样的信息之前,请仔细检查,因为如果信息不正确,那么它就是误导,对那些试图帮助你的人和你自己都没有帮助。不是作为批评家,而是作为建设性的建议:)

    @fara:你告诉我。如果这是你的问题,那就问一个新问题。@fara:你告诉我。如果这是你的问题,那么问一个新的问题。如果我尝试数字2。它给出了和我一样的答案。上面给出了f.split的结果。它给出了和我一样的答案。上面给出了f.split的结果。