【问题标题】:Tokenizing first and last name as one token将名字和姓氏标记为一个标记
【发布时间】:2014-05-07 05:32:02
【问题描述】:

是否可以对标记中的文本进行标记,以便将名字和姓氏组合在一个标记中? 例如,如果我的文字是:

text = "Barack Obama is the President"

然后:

text.split()

结果:

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

如何识别名字和姓氏?所以我只得到['Barack Obama', 'is', 'the', 'President'] 作为令牌。

有没有办法在 Python 中实现?

【问题讨论】:

标签: python nlp tokenize


【解决方案1】:

您正在寻找的是一个命名实体识别系统。我建议您不要将其视为标记化的一部分。

对于python,您可以使用https://pypi.python.org/pypi/ner/

来自网站的示例

>>> tagger.json_entities("爱丽丝去了自然历史博物馆。")
'{"ORGANIZATION": ["自然历史博物馆"], "PERSON": ["Alice"]}'

【讨论】:

  • 谢谢,它看起来是个不错的工具,只是因为这个错误我无法让它工作:NLTK was unable to find the java file! Use software specific configuration paramaters or set the JAVAHOME environment variable.,但我接受了答案。
【解决方案2】:

这是一个满足您问题需求的正则表达式。它将查找以小写字符开头的单个单词,或匹配单例或成对的大写单词。

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']
  • 如果你想捕捉大写单词的较长连续短语,请将模式更改为r"[a-z]\w+|[A-Z]\w+(?: [A-Z]\w+)*",但正则表达式确实有其局限性。我建议研究 NER(命名实体识别)系统,例如 NLTK
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 2017-09-25
  • 1970-01-01
相关资源
最近更新 更多