0

我正在尝试处理一个 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 函数有什么希望吗?

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

4

2 回答 2

2

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

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

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

于 2010-11-17T16:54:11.683 回答
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 个值可能太慢了。

于 2010-11-17T17:11:16.847 回答