我正在尝试处理一个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%的记录,或者为每个组织精心创建多个别名。我希望能够做的是捕捉小的差异(例如小错误拼写,连字符与空格和常用缩写),如果仍然没有找到匹配,理想地识别组织名称并创建新记录为了它。
任何帮助或见解都将不胜感激。
答案 0 :(得分:2)
这属于模糊逻辑领域。看看这些是否有任何帮助:
http://www.phpclasses.org/blog/post/119-Neural-Networks-in-PHP.html
答案 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个值上计算得太慢。