命名实体识别的Python nltk取决于第一个字母的(上)情况



我正计划使用Python NLTK进行学术研究。特别是,我需要一种筛选Twitter用户的方法,并取消似乎没有在其个人资料中使用"真实名称"的用户。

我正在考虑使用默认的NLTK的名称实现识别来将使用看似真实名称的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似乎主要通过该词的第一个字母是Capital认识到一个名称实体?例如," ICU护士多伦多"将被NNP认可,而" ICU护士多伦多护士"不会。它似乎过于简约,并且对于我的目的而言并不是很有用(Twitter),因为许多使用真实名称的Twitter用户可能使用较低的案例,而某些商业组织将使用资本第一字母。

肯定自己训练一个人。NLTK的NE识别器经过培训,可以识别嵌入完整句子的指定实体。但是,不要只是对新数据的NLTK NE识别器进行重新训练;它是一个"顺序分类器",这意味着它考虑了周围的单词和pos标签以及前面单词的指定实体分类。由于您已经拥有用户名,因此对于您的目的而言,这些都不会有用或相关。

我建议您培训常规分类器(例如,天真的贝叶斯),将其喂食您认为可能相关的任何自定义功能,并要求它决定"这是真实的名字"。要训练,您必须有一个培训语料库,其中包含非名称名称和示例的示例。理想情况下,语料库应包括您要进行分类的内容:Twitter手柄。

在您的评论中,不要将整个单词用作特征:您的分类器只能使用它知道的功能,因此人口普查名称无法帮助您使用新名称,除非您的功能大于 parts名称。通常,这些功能代表结尾(最后一封字母,最后的bigram,最后的trigram),但是您可以尝试其他东西,例如长度,当然还有大写。NLTK章节讨论了识别名称性别的任务,并给出了许多后缀功能的示例。

就您而言,捕获是您有多个单词。因此,如果某些单词被识别为名称,而有些则不是,则需要以某种方式告知您的分类器。您必须以保留此信息的方式定义您的功能。例如,您可以将功能"已知名称"设置为具有"无","一个","几个","的值。(请注意,NLTK的实现将特征值视为"类别":它们只是不同的值。您可以将3和4用作特征值,但是就分类器而言,您也可以使用"绿色"one_answers"电梯"。)

不要忘记添加具有恒定值的"偏差"功能(请参阅NLTK章节)。

您肯定必须自己培训分类器。例如,由于您正在研究名称,因此您可以查看本nltk章节。本章描述的简单的天真贝叶斯分类器要测试名称是"男性"还是"女性",可以很好地了解这种特征。同样,您询问哪些功能的问题更像是一个问题和域特定的问题。除了所有信息提取研究人员使用的通用功能外,还可能还有其他类型的功能。但是同样,这些纯粹取决于您的数据。确实浏览了这一章,它为您提供了建立自己的分类器的所有基本工具。

顺便说一句,由于您提到了Twitter用户名,因此我还建议使用归一化器,因为大多数名称可能仅包含字母。例如,用户名也可以是" t0m",而不是"汤姆"。也许您已经在这样做了,如果您是,我很抱歉再次重复。

相关内容

最新更新