Python NLTK 命名实体识别取决于首字母的(大写)?
Posted
技术标签:
【中文标题】Python NLTK 命名实体识别取决于首字母的(大写)?【英文标题】:Python NLTK named entity recognition depends by the (upper)case of first letter? 【发布时间】:2015-07-19 21:55:27 【问题描述】:我计划使用 Python NLTK 进行学术研究。特别是,我需要一种筛选 Twitter 用户的方法,并挑出那些在他们的个人资料中似乎没有使用“真实姓名”的用户。
我正在考虑使用默认的 NLTK 名称实体识别来区分使用看似真实姓名的 Twitter 用户和不使用真实姓名的 Twitter 用户。你觉得值得一试吗?还是我应该自己训练分类器?
import nltk
import re
import time
##contentArray0 =['Health Alerts', "Kenna Hill"]
contentArray =['ICU nurse toronto']
##let the fun begin!##
def processLanguage():
try:
for item in contentArray:
tokenized = nltk.word_tokenize(item)
tagged = nltk.pos_tag(tokenized)
print tagged
namedEnt = nltk.ne_chunk(tagged)
##namedEnt.draw()
time.sleep(1)
except Exception, e:
print str(e)
processLanguage()
编辑:我做了一些测试。似乎 nltk 主要通过单词的第一个字母是否大写来识别名称实体?例如,“ICU Nurse Toronto”将被 NNP 识别,而“ICU Nurse Toronto”则不会。这似乎过于简单,而且对我的目的(推特)不是很有用,因为许多使用实名的 Twitter 用户可能使用小写字母,而某些商业组织将使用大写的首字母。
【问题讨论】:
在正确的文本上训练 truecaser,然后在 twitter 文本上使用 truecaser 【参考方案1】:一定要自己训练。 NLTK 的 NE 识别器经过训练,可以识别嵌入在完整句子中的命名实体。但不要只是重新训练 nltk 的 NE 识别器来处理新数据;它是一个“顺序分类器”,意味着它考虑了周围的词和词性标签以及前面词的命名实体分类。由于您已经拥有用户名,因此这些用户名对您的目的没有用处或相关。
我建议您训练一个常规分类器(例如,朴素贝叶斯),为其提供您认为可能相关的任何自定义特征,并要求它决定“这是一个真实的名字”。要进行训练,您必须拥有一个包含名称示例和非名称示例的训练语料库。理想情况下,语料库应该包含您要分类的内容:twitter 句柄。
关于您评论中的问题,不要将整个单词用作特征:您的分类器只能使用它知道的特征进行推理,因此人口普查名称无法帮助您获得新颖的名称,除非您的特征与 部分有关 的名称。通常特征代表结尾(最后一个字母、最后一个二元组、最后一个三元组),但你也可以尝试其他的东西,比如长度,当然还有大写。 NLTK 章节讨论了识别姓名性别的任务,并提供了许多后缀特征的示例。
就您而言,问题在于您有多个单词。因此,如果某些单词被识别为名称而某些单词不是,则需要以某种方式告知您的分类器。不知何故,您必须以保留此信息的方式定义您的功能。例如,您可以将特征“已知名称”设置为具有值“无”、“一个”、“几个”、“全部”。 (请注意,NLTK 的实现将特征值视为“类别”:它们只是不同的值。您可以使用 3 和 4 作为特征值,但就分类器而言,您还不如使用“green”和“elevator” “。)
并且不要忘记添加具有恒定值的“偏差”功能(请参阅 NLTK 章节)。
【讨论】:
谢谢,假设我有一个人口普查数据(带有真实姓名)要训练,为了处理 Twitter 个人资料中不在人口普查数据中的名字,最好的训练方法是什么?例如,我应该使用完整的名字和姓氏作为特征吗?我应该使用反例,比如用字典词训练来指示什么不是名字? 用答案扩展了我的答案。您需要一个包含正例和反例的训练语料库。但实际上,您必须阅读 NLTK 章节并提出后续问题。 这一章其实我已经读过很多遍了,之前也做过朴素贝叶斯分类器。我认为具有挑战性的是找到正确的否定示例(非姓名)并找出要提取的哪些特征能够始终如一地将真实姓名与其他英文单词区分开来。 对于负面例子(非名字),哪里是一个好的来源?我看过字典,但名字出现在字典中。否定示例可以是英语(牛津)词典中的所有非名词条目吗? 如果你的语料库由用户名组成,分为人名和非姓名,你肯定会得到最好的结果。任何人都可以猜测您是否可以通过对随机的非名字单词集合进行训练来获得可用的结果;即使你从字典中减去专有名称(这可能并不难),你剩下的也不适合训练分类器,因为它看起来不像 Twitter 用户名。你能手工编写足够大的推特名称语料库来用作训练吗?【参考方案2】:您肯定需要自己训练分类器。例如,由于您正在处理名称,您可以查看此 NLTK chapter。本章描述的简单朴素贝叶斯分类器用于测试名称是“男性”还是“女性”,可以很好地了解特征类型。此外,您关于询问哪些功能的问题更多的是一个问题和特定领域的问题。除了所有信息提取研究人员使用的通用特征外,可能还有其他类型的特征。但同样,这些完全取决于您的数据。请务必阅读该章节,它为您提供了构建自己的分类器的所有基本工具。
顺便说一句,既然您提到了 Twitter 用户名,我还建议使用规范化器,因为大多数名称可能只包含字母。例如,代替“Tom”,用户名也可以是“T0m”。也许你已经在这样做了,如果你这样做了,我很抱歉再次重复。
【讨论】:
以上是关于Python NLTK 命名实体识别取决于首字母的(大写)?的主要内容,如果未能解决你的问题,请参考以下文章