2010-11-17 1 views
0

Я пытаюсь обработать CSV-файл, который имеет, как и в каждой строке, текстовое поле с названием организации и положением лица внутри этой организации как неструктурированный текст. Это поле, как правило, беспорядок текста следующим образом:Именованное распознавание объектов с предустановленным списком имен для Python/PHP

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 позволят выполнить сопоставление подобия, которое будет иметь более широкий охват?
  • Будет ли NLTK в Python улавливать орфографические ошибки?
  • Можно ли использовать AlchemyAPI для обнаружения орфографических организаций? До сих пор я мог использовать его, чтобы поймать правильно созданные организации
  • Поскольку я сравниваю короткую строку (название организации) с более длинной строкой (включая имя плюс постороннюю информацию), есть ли какая-либо надежда в используя функцию аналогичного текста PHP?

Любая помощь или понимание будут оценены.

ответ

2

Это область с нечеткой логикой. Смотрите, если это какой-либо помощи:

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

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

+0

Спасибо, что указали эти ресурсы. Я не знаком с нейронными сетями, но я попытаюсь вникать в это и посмотреть, смогу ли я заставить его работать. – tchaymore

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 университет' имеет гораздо более низкий коэффициент соответствия(), чем входы вы дали.

С другой стороны, SequenceMatcher.ratio() может быть слишком медленным, рассчитанным на 16 000 значений.