命名实体识别,带有Python / PHP的预设名称列表

时间:2010-11-17 16:47:53

标签: php python text nlp named-entity-recognition

我正在尝试处理一个CSV文件,该文件在每行中都有一个文本字段,其中包含组织名称和该组织中个人的位置作为非结构化文本。这个字段通常是一堆乱七八糟的文字:

Assoc. Research Professor  Dept. Psychology  Univ. California  Santa Barbara

我需要提取职位和组织名称。对于这个职位,我使用preg_match为不同的职业生成一系列约60种不同的正则表达式,我认为它运作得很好(我的猜测是它可以捕获大约80%)。但是,我在抓住组织名称时遇到了麻烦。我有一个MySQL表,大约有16,000个组织名称,我可以执行一个简单的preg_match,但由于常见的拼写错误和缩写,它只能捕获大约30%的组织。例如,我的数据库有

University of California Santa Barbara

但CSV文件可能包含以下任何选项:

Univ Cal Santa Barbara
University Cal-Santa Barbara
University California-Santa Barbara
Cal University, Santa Barbara

我需要处理数十万条记录,而且我不能花时间纠正当前没有正确处理的70%的记录,或者为每个组织精心创建多个别名。我希望能够做的是捕捉小的差异(例如小错误拼写,连字符与空格和常用缩写),如果仍然没有找到匹配,理想地识别组织名称并创建新记录为了它。

  • Python或PHP中的哪些库或工具可以执行具有更广泛覆盖范围的相似性匹配?
  • Python中的NLTK会不会出现拼写错误?
  • 是否可以使用AlchemyAPI来捕获拼写错误的组织?到目前为止,我只能用它来捕捉正确拼写的组织
  • 由于我正在将一个短字符串(组织名称)与一个较长的字符串(包括该名称加上无关的信息)进行比较,因此使用PHP的similar_text函数是否有希望?

任何帮助或见解都将不胜感激。

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

您可以使用difflib来计算CSV输入和规范拼写之间的相似度比率,如果它高于某个阈值(例如,0.65),则将其视为匹配。

例如:

import difflib

exact = 'University of California Santa Barbara'

inputs = ['Univ Cal Santa Barbara',
          'University Cal-Santa Barbara',
          'University California-Santa Barbara',
          'Cal University, Santa Barbara',
          'Canterbury University']

sm = difflib.SequenceMatcher(None, exact)
ratios = []
for input in inputs:
    sm.set_seq2(input)
    ratios.append(sm.ratio())

print ratios

给出:

[0.73333333333333328, 0.81818181818181823, 0.93150684931506844,
 0.71641791044776115, 0.33898305084745761]

请注意'坎特伯雷大学'的匹配率()比您提供的输入低得多。

然后,SequenceMatcher.ratio()可能在16,000个值上计算得太慢。