Нужно извлекать информацию из свободного текста, такую ​​как местоположение, курс и т. Д - PullRequest
1 голос
/ 08 ноября 2011

Мне нужно написать анализатор текста для образовательной области, который может извлекать информацию, такую ​​как институт, местоположение, курс и т. Д., Из свободного текста.

В настоящее время я делаю это через люцен, шаги следующие:

  1. Индексировать все данные, относящиеся к институту, курсам и местоположению.
  2. Создание фрагментов произвольного текста и поиск каждого фрагмента в каталоге местоположений, курса и института, а затем попытка выяснить, какая часть текста представляет местоположение, курс и т. Д.

В этом подходе я пропускаю множество случаев, когда B.tech можно записать как btech, b-tech или b.tech.

Я хочу знать, есть ли какая-либо вещь, которая может делать все подобные вещи, я слышал о Ling-pipe и Gate, но не знаю, насколько они эффективны.

Ответы [ 6 ]

1 голос
/ 09 ноября 2011

Вам определенно нужно GATE . GATE имеет 2 основных наиболее часто используемых функции (среди тысяч других): правила и словари . Словари (gazetteers в терминах GATE) позволяют вам поместить все возможные случаи, такие как "B.tech", "btech" и т. Д., В один текстовый файл и позволить GATE найти и отметить их все. Правила (точнее, JAPE-правила) позволяют вам определять шаблоны в тексте. Например, вот схема для определения почтового адреса Массачусетского технологического института ("77 Massachusetts Ave., Building XX, Cambridge MA 02139"):

{Token.kind == number}(SP){Token.orth == uppercase}(SP){Lookup.majorType == avenue}(COMMA)(SP)
{Token.string == "Building"}(SP){Token.kind == number}(COMMA)(SP)
{Lookup.majorType == city}(SP){Lookup.majorType == USState}(SP){Token.kind == number}

где (SP) и (COMMA) - макросы (только для сокращения текста), {Somthing} - аннотация, {Token.kind == number} - аннотация "Token" с признаком "kind", равным "number" (т.е. просто число в тексте), {Lookup} - аннотация, которая фиксирует значения из словаря (кстати, GATE уже имеет словари для таких вещей, как города США). Это довольно простой пример, но вы должны увидеть, как легко вы можете охватить даже очень сложные случаи.

0 голосов
/ 09 декабря 2011

B.tech можно записать как btech, b-tech или b.tech

Lucene позволит вам нечетких поисков на основе расстояния Левенштейна. Запрос для roam~ (обратите внимание на ~) найдет такие термины, как foam и roams.

Это может позволить вам сопоставить разные случаи.

0 голосов
/ 14 ноября 2011

Вы можете попробовать http://code.google.com/p/graph-expression/ пример правил разбора адреса

  GraphRegExp.Matcher Token = match("Token");
            GraphRegExp.Matcher Country = GraphUtils.regexp("^USA$", Token);
            GraphRegExp.Matcher Number = GraphUtils.regexp("^\\d+$", Token);
            GraphRegExp.Matcher StateLike = GraphUtils.regexp("^([A-Z]{2})$", Token);
            GraphRegExp.Matcher Postoffice = seq(match("BoxPrefix"), Number);
            GraphRegExp.Matcher Postcode =
                            mark("Postcode", seq(GraphUtils.regexp("^\\d{5}$", Token), opt(GraphUtils.regexp("^\\d{4}$", Token))))
                    ;
            //mark(String, Matcher) -- means creating chunk over sub matcher
            GraphRegExp.Matcher streetAddress = mark("StreetAddress", seq(Number, times(Token, 2, 5).reluctant()));
            //without new lines
            streetAddress = regexpNot("\n", streetAddress);
            GraphRegExp.Matcher City = mark("City", GraphUtils.regexp("^[A-Z]\\w+$", Token));

            Chunker chunker = Chunkers.pipeline(
                    Chunkers.regexp("Token", "\\w+"),
                    Chunkers.regexp("BoxPrefix", "\\b(POB|PO BOX)\\b"),
                    new GraphExpChunker("Address",
                            seq(
                                    opt(streetAddress),
                                    opt(Postoffice),
                                    City,
                                    StateLike,
                                    Postcode,
                                    Country
                            )
                    ).setDebugString(true)
            );
0 голосов
/ 09 ноября 2011

Вы можете проверить UIMA . Как и в Lingpipe и Gate, эта структура содержит текстовые аннотации, что вы и пытаетесь сделать. Вот учебник, который поможет вам написать аннотатор для UIMA:

http://uima.apache.org/d/uimaj-2.3.1/tutorials_and_users_guides.html#ugr.tug.aae.developing_annotator_code

UIMA имеет аддонов , в частности один для интеграции Lucene .

0 голосов
/ 09 ноября 2011

Вам может понадобиться написать регулярное выражение, чтобы охватить каждую возможную форму вашего словаря.

Будьте внимательны при выборе анализатора / токенизатора, потому что такие слова, как B.tech могут бытьлегко разбить на 2 разных слова (т.е. B и tech ).

0 голосов
/ 08 ноября 2011

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

...