Разбор текста в предложения? - PullRequest
3 голосов
/ 09 июня 2009

Я пытаюсь разделить текст PDF-страницы на предложения, но это гораздо сложнее, чем я ожидал. Необходимо рассмотреть целый ряд особых случаев, таких как инициалы, десятичные дроби, цитаты и т. Д., Которые содержат точки, но не обязательно заканчивают предложение.

Мне было бы любопытно, если бы кто-нибудь здесь был знаком с библиотекой NLP для C или C ++, которая могла бы помочь мне с этой задачей или просто дать какой-нибудь совет?

Спасибо за любую помощь.

Ответы [ 4 ]

6 голосов
/ 09 июня 2009

Эта проблема называется устранение неоднозначности границ предложения . На странице Википедии перечислены несколько библиотек, но я не уверен, что какая-либо из них легко вызывается из C.

Вы можете найти много работ по теории неоднозначности границ предложений. Стандарт Unicode в Приложении № 29 к стандарту Unicode - Сегментация текста Unicode также определяет простой алгоритм определения границ предложений.

3 голосов
/ 09 июня 2009

Устранение неоднозначности границ предложения (SBD) является центральной проблемой в области НЛП. К сожалению, те, что я нашел и использовал в прошлом, не на C (поскольку это не любимый язык для строковых задач, если только скорость не является серьезной проблемой)

Pipeline

Если бы это было возможно, я бы создал простой конвейер - если в системе Unix это не должно быть проблемой, но даже если вы работаете в Windows с языком сценариев, вы должны быть в состоянии заполнить пробелы. Это означает, что SBD может быть лучшим инструментом для работы, а не просто единственным SBD, которое вы можете найти для языка Z. Например,

./pdfconvert | SBD | my_C_tool > ...

Это стандартный способ, которым мы делаем вещи в моей работе, и если у вас нет более строгих требований, чем вы заявили, все будет хорошо.

Инструменты

Что касается инструментов, которые вы можете использовать,

  • Я бы предложил MXTERMINATOR, который является инструментом SBD, использующим моделирование максимальной энтропии, поскольку мои супервизоры недавно использовали его в своей работе. По их словам, он пропустил несколько разбиений предложений, но это было легко исправить с помощью sed . Они делали SBD на астрономических документах. основной сайт в данный момент отображается внизу, но здесь доступно FTP-зеркало здесь .
  • OpenNLP имеет переопределение вышеупомянутого алгоритма с использованием моделирования максимальной энтропии в Java ( JavaDoc ) и является более современным с кажущимся более сильным сообществом позади него.
  • Сентрик и многие другие существуют также. Для более подробной информации есть более старый список здесь , который может быть полезен.

Модели и обучение

Теперь некоторые из этих инструментов могут дать вам хорошие результаты из коробки, а некоторые - нет. OpenNLP включает модель для определения английского предложения из коробки, которая может работать для вас. Если ваш домен значительно отличается от того, на котором обучались инструменты, он может работать не очень хорошо. Например, если они были обучены газетному тексту, они могут быть очень хороши в этой задаче, но ужасны в письмах.

Таким образом, вы можете обучить инструмент SBD, приводя его примеры. Каждый из инструментов должен документировать этот процесс, но я предупрежу вас, это может быть немного работы. Это потребовало бы, чтобы вы запустили инструмент в документе X, прошли и вручную исправили все неправильные разбиения и вернули правильно разделенный документ X обратно в инструмент для обучения. В зависимости от размеров документов и используемого инструмента вам может потребоваться сделать это для одного или ста документов, пока вы не получите разумный результат.

Удачи, и если у вас есть какие-либо вопросы, не стесняйтесь спрашивать.

2 голосов
/ 09 июня 2009

Это проблема синтаксического анализа, а не язык программирования. и как таковой, никогда не будет легкого ответа. Однако это может быть эвристика, которую вы можете применить, и которую мы могли бы порекомендовать, если бы знали, почему вы разбиваете PDF-файлы на предложения и что вы хотите делать с предложениями после их получения?

0 голосов
/ 20 июля 2011

Некоторое время назад у меня были такие же требования. Я попробовал несколько решений. Лучшим из них была сплитта (http://code.google.com/p/splitta/). Это работало хорошо для всех крайних условий, которые я бросил в это. питтон сплитты.

Я также попробовал sentrick (java). http://www.denkselbst.de/sentrick/index.html

К сожалению, у меня нет полного списка всех опций, которые я пробовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...