4

我从来没有真正处理过 NLP,但对 NER 有一个想法,它不应该起作用,并且在某种情况下做得非常好。我不明白它为什么起作用,为什么不起作用或天气可以延长。

这个想法是通过以下方式提取故事中主要人物的名字:

  1. 为每个单词构建字典
  2. 为每个单词填写一个列表,其中包含文本中出现在它旁边的单词
  3. 为每个单词找到一个与列表相关性最大的单词(意味着这些单词在文本中的使用相似)
  4. 鉴于故事中一个角色的名字,像它一样使用的词也应该是这样的(假的,那是不应该的,但因为直到今天早上我才开始处理 NLP,所以我开始了天真的一天)

我在Alice in Wonderland上运行了过于简单的代码(附在下面),“Alice”返回:

21 ['鼠标','纬度','威廉','兔子','渡渡鸟','狮鹫','螃蟹','女王','公爵夫人','步兵','黑豹','毛毛虫', '心','国王','比尔','鸽子','猫','帽子','野兔','乌龟','睡鼠']

尽管它会过滤大写单词(并接收“Alice”作为要聚集的单词),但最初有大约 500 个大写单词,就主要角色而言,它仍然非常合适。

它不适用于其他角色和其他故事,但会产生有趣的结果。

知道这个想法是否可用、可扩展,或者为什么它在这个故事中对“爱丽丝”起作用?

谢谢!

#English Name recognition
import re
import sys
import random
from string import upper

def mimic_dict(filename):
  dict = {}
  f = open(filename)
  text = f.read()
  f.close()
  prev = ""
  words = text.split()
  for word in words:
    m = re.search("\w+",word)
    if m == None:
      continue
    word = m.group()
    if not prev in dict:
      dict[prev] = [word]
    else :
      dict[prev] = dict[prev] + [word] 
    prev = word
  return dict

def main():
  if len(sys.argv) != 2:
    print 'usage: ./main.py file-to-read'
    sys.exit(1)

  dict = mimic_dict(sys.argv[1])
  upper = []
  for e in dict.keys():
    if len(e) > 1 and  e[0].isupper():
      upper.append(e)
  print len(upper),upper

  exclude = ["ME","Yes","English","Which","When","WOULD","ONE","THAT","That","Here","and","And","it","It","me"]
  exclude = [ x  for x in exclude if dict.has_key(x)] 
  for s in exclude :
    del dict[s]

  scores = {}
  for key1 in dict.keys():
    max = 0
    for key2 in dict.keys():
      if key1 == key2 : continue
      a =  dict[key1]
      k =  dict[key2]
      diff = []
      for ia in a:
        if ia in k and ia not in diff:
          diff.append( ia)
      if len(diff) > max:
        max = len(diff)
        scores[key1]=(key2,max)
  dictscores = {}
  names = []
  for e in scores.keys():
    if scores[e][0]=="Alice" and e[0].isupper():
      names.append(e)
  print len(names), names     


if __name__ == '__main__':
  main()
4

2 回答 2

7

从您的程序的外观和以前使用 NER 的经验来看,我会说这“有效”,因为您没有进行适当的评估。您在本应找到“三月野兔”的地方找到了“野兔”。

NER 的困难(至少对于英语来说)是找不到名字。它正在检测它们的全部范围(“三月野兔”示例);即使在所有单词都大写的句子开头也能检测到它们;将它们分类为人/组织/位置/等。

此外,《爱丽丝梦游仙境》作为儿童小说,是一个相当容易处理的文本。像“微软首席执行官史蒂夫鲍尔默”这样的新闻专线提出了一个更难的问题。在这里,你想检测

[ORG Microsoft] CEO [PER Steve Ballmer]
于 2012-05-14T15:24:35.083 回答
3

你正在做的是建立一个分布式词库- 查找与查询(例如 Alice)在分布上相似的词,即出现在相似上下文中的词。这不会自动使它们成为同义词,但意味着它们在某种程度上类似于查询。您的查询是命名实体这一事实本身并不能保证您检索到的相似词将是命名实体。然而,由于Alice,HareQueen倾向于出现相似的上下文,因为它们有一些共同的特征(例如,它们都会说话、走路、哭泣等——爱丽丝梦游仙境的细节让我无法理解)它们更有可能被检索到。事实证明,在确定某物是否为命名实体时,单词是否大写是非常有用的信息。如果你不过滤掉非大写的单词,你会看到很多其他没有命名实体的邻居。

查看以下论文,了解人们如何使用分布式语义:

为了将您的想法放在这些论文中使用的术语中,步骤 2 为来自大小为 1 的窗口的单词构建上下文向量。步骤 3 类似于分布语义中的几个众所周知的相似性度量(最著名的是所谓的 Jaccard系数)。

正如所larsmans指出的,这似乎很有效,因为您没有进行适当的评估。如果你对一个手工注释的语料库运行这个,你会发现它在识别名称实体的边界方面非常糟糕,它甚至不会尝试猜测它们是人、地方还是组织......不过,这是一个很好的第一个尝试 NLP,继续努力!

于 2012-05-14T17:57:42.377 回答