使用预设名称列表进行Python/PHP的命名实体识别

0 投票
2 回答
1414 浏览
提问于 2025-04-16 07:13

我正在处理一个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 个回答

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]

注意到“Canterbury University”的匹配率比你输入的其他内容要低得多。

不过,使用SequenceMatcher.ratio()来计算超过16,000个值时,可能会比较慢。

2

这属于模糊逻辑的范畴。看看这些链接是否对你有帮助:

http://www.phpclasses.org/blog/post/119-Neural-Networks-in-PHP.html

http://ann.thwien.de/index.php/Installation

撰写回答