【问题标题】:Dictionary-based NLTK tagger基于字典的 NLTK 标注器
【发布时间】:2013-09-07 06:47:12
【问题描述】:

我想使用 NLTK 和 Stanford-NLP 在文本中标记位置字符串

我正在寻找 NLTK/Stanford-NLP 的字典查找标记器,到目前为止,我还没有找到任何使用 Dictionary-lookup 方法的东西。

一种方法是使用 RegexpTagger(NLTK) 并在其中提供每个位置字符串,但它可能会变慢。

我不需要做任何语义分析,除了根据我的位置词典标记位置。

想法?

【问题讨论】:

  • 你能提供一个关于你的位置字典的条目吗?

标签: geolocation nlp nltk tagging stanford-nlp


【解决方案1】:

你可以使用UnigramTagger:

#!/usr/bin/env python2

from nltk.tag.sequential import UnigramTagger
from nltk.tokenize import word_tokenize, sent_tokenize

text = 'I visited Paris and Bordeaux. Not Los Angeles'

locations = [[('Paris', 'LOC'), ('Bordeaux', 'LOC'), ('France', 'LOC'),
              ('Los Angeles', 'LOC')]]    
location_tagger = UnigramTagger(locations)

for sentence in sent_tokenize(text):
    tokens = word_tokenize(sentence)
    print(location_tagger.tag(tokens))

打印:

[('I', None), ('visited', None), ('Paris', 'LOC'), ('and', None),
 ('Bordeaux', 'LOC'), (',', None), ('but', None), ('not', None),
 ('Los', None), ('Angeles', None)]

如果您想标记像洛杉矶这样的多词位置,您将需要一个更好的标记器。

【讨论】:

  • 谢谢。正如您所说,棘手的部分是标记二元组和三元组。您建议使用什么标记器?
  • 如果您只需要对 'Los' 和 'Angeles' 进行分组(比如说),最简单的方法是在应用 unigram 标记器后自己进行,但它并不能真正扩展到其他改进,例如。处理歧义或其他类型的标签。
【解决方案2】:

如果您只需要从字典中查找,那么 htql.RegEx() 可能是一个不错的选择。以下是来自http://htql.net 的示例:

import htql; 
address = '88-21 64th st , Rego Park , New York 11374'
states=['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 
    'Delaware', 'District Of Columbia', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 
    'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan', 
    'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire', 
    'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota', 'Ohio', 'Oklahoma', 
    'Oregon', 'PALAU', 'Pennsylvania', 'PUERTO RICO', 'Rhode Island', 'South Carolina', 'South Dakota', 
    'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 
    'Wyoming']; 

a=htql.RegEx(); 
a.setNameSet('states', states);

state_zip1=a.reSearchStr(address, "&[s:states][,\s]+\d{5}", case=False)[0]; 
# state_zip1 = 'New York 11374'

state_zip2=a.reSearchList(address.split(), r"&[ws:states]<,>?<\d{5}>", case=False)[0]; 
# state_zip2 = ['New', 'York', '11374']

您可以使用参数:useindex=True 返回匹配的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2015-02-20
    相关资源
    最近更新 更多