使用预设名称列表进行Python/PHP的命名实体识别
我正在处理一个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