NLTK模式能否直接传入字符串?企业名称提取代码无输出求助
嘿,我来帮你排查下问题,顺便解答你的疑问~
首先看你的代码,有几个小问题导致没有输出:
1. 导入语句语法错误
你的导入写在了一行,这会触发语法错误,应该分成两行(或者用逗号分隔):
from nltk.tokenize import sent_tokenize, word_tokenize from nltk import pos_tag, RegexpParser
2. 分词方式不正确
你用了sent.split()来拆分句子,但这种方式只是按空格分割,会把GmbH.、Inc.当成一个完整的词,导致POS标签识别错误(比如GmbH.可能被标为NN而不是你期望的独立标签)。应该用NLTK的word_tokenize(),它会正确拆分单词和标点:
tokens = word_tokenize(sent) pos_tags = pos_tag(tokens)
3. RegexpParser模式的写法错误
你在模式里写了<GmbH|Inc|corp>,但RegexpParser的模式是基于词性标签(POS Tag)的,尖括号里只能填POS标签(比如NNP、NN),不能直接写具体的字符串值——这也是你那个疑问的答案:不能直接在模式里传入字符串值,这个工具是靠词性标签来匹配短语的。
那怎么实现你的需求呢?可以先匹配连续的专有名词(企业名通常是NNP标签),然后在遍历子树的时候,检查短语的最后一个词是否是你要的后缀(GmbH/Inc/corp)。
修正后的完整代码
from nltk.tokenize import sent_tokenize, word_tokenize from nltk import pos_tag, RegexpParser text = "CompanyName1 GmbH is from Germany. CompanyName2 Inc is from America. CompanyName3 corp is from India." # 先匹配连续的专有名词序列 pattern = r""" P: {<NNP>+} """ PChunker = RegexpParser(pattern) for sent in sent_tokenize(text): tokens = word_tokenize(sent) pos_tags = pos_tag(tokens) print("Parts of speech :", pos_tags) output = PChunker.parse(pos_tags) for subtree in output.subtrees(filter=lambda t: t.label() == 'P'): phrase_words = [x[0] for x in subtree] # 检查短语最后一个词是否是目标后缀 if phrase_words[-1] in ['GmbH', 'Inc', 'corp']: print(' '.join(phrase_words))
额外小建议
如果是提取企业/组织名称,也可以试试NLTK的命名实体识别(NER)工具ne_chunk(),它能直接识别ORGANIZATION类型的实体,可能更省心:
from nltk.tokenize import word_tokenize from nltk import pos_tag, ne_chunk text = "CompanyName1 GmbH is from Germany. CompanyName2 Inc is from America. CompanyName3 corp is from India." for sent in sent_tokenize(text): tokens = word_tokenize(sent) pos_tags = pos_tag(tokens) chunks = ne_chunk(pos_tags) for subtree in chunks.subtrees(filter=lambda t: t.label() == 'ORGANIZATION'): print(' '.join([x[0] for x in subtree]))
运行修正后的代码,你应该就能得到想要的企业名称输出啦~
内容的提问来源于stack exchange,提问作者user9845038
相关产品推荐
相关产品推荐

