Распознавание именованных объектов с предустановленным списком имен для Python / PHP - PullRequest
0 голосов
/ 17 ноября 2010

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

Буду признателен за любую помощь или понимание.

Ответы [ 2 ]

2 голосов
/ 17 ноября 2010

Это в области нечеткой логики. Посмотрите, помогут ли они:

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

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

1 голос
/ 17 ноября 2010

Вы можете использовать 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 значений.

...