从标记语料库中提取数据的Python方法
你好,我正在尝试从一个标记好的语料库中提取专有名词。举个例子,我想从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
但是它没有显示出单词,而是只显示了
[]
示例输出:
[('The', 'AT'), ('Fulton', 'NP-TL'), ...]
[]
这是为什么呢??
谢谢。
我如果只打印 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').....
2 个回答
0
有人可能会认为 t.split('/')[1] == 'NP'
这个表达式总是返回假,也就是不成立。
4
从你给的信息来看,我不太能判断,但你有没有试着一步一步地解决问题?看起来在任何情况下,t.split('/')[1] == 'NP'
这个条件都不会为真。所以你应该先:
- 打印一下,看看
f.split()
里面到底有什么内容 - 确认一下你的条件是否真的正确,从你给的小样本输出来看,我觉得你可能更想要的是:
if 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'), ....]
以后在发布信息之前,最好再检查一下我问的内容,因为如果不正确,那就会误导别人,也帮不了你自己。这不是批评,而是建设性的建议 :)