将名字和姓氏作为一个标记进行分词处理

4

有没有可能将文本标记化为令牌,以便将名字和姓氏组合在一个令牌中? 例如,如果我的文本是:

text = "Barack Obama is the President"

然后:

text.split()

结果是:

['Barack', 'Obama', 'is', 'the, 'President']

如何识别名字的姓和名?这样我就只能得到['Barack Obama', 'is', 'the', 'President']作为标记。

在Python中有没有实现这个功能的方法?


1
希望这可以帮到你:http://www.nltk.org/book/ch07.html - shengy
2个回答

3
你需要的是一个命名实体识别系统。建议不将其视为分词的一部分。
对于Python,您可以使用https://pypi.python.org/pypi/ner/
来自该网站的示例:

>>> tagger.json_entities("Alice went to the Museum of Natural History.")
'{"ORGANIZATION": ["Museum of Natural History"], "PERSON": ["Alice"]}'


谢谢,看起来是一款不错的工具,但是我无法使用它,因为出现了这个错误: NLTK无法找到Java文件!请使用软件特定的配置参数或设置JAVAHOME环境变量。 不过,我接受这个答案。 - TJ1

1
这是一个满足你问题需求的正则表达式。它可以找到以小写字符开头的单词,或匹配大写单词的单例或成对出现。
import re
re.findall(r"[a-z]\w+|[A-Z]\w+(?: [A-Z]\w+)?",text)

输出

['Barack Obama', 'is', 'the', 'President']

谢谢您的回答,这是一个不错的开始,但并不完全准确。如果文本是:“Mr Barack Obama is the President”,它将产生:“['Mr Barack','Obama','is','the','President']”。 - TJ1
2
如果您希望捕获更长的连续大写单词短语,请将模式更改为r"[a-z]\w+|[A-Z]\w+(?: [A-Z]\w+)*"。但是,正则表达式确实有其限制。我建议您研究命名实体识别(NER)系统,例如NLTK - mtadd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接