Определение границы слова из текста - PullRequest
4 голосов
/ 04 сентября 2010

У меня проблема с идентификацией границы слова.Я удалил всю разметку из документа википедии, теперь я хочу получить список объектов (значимые термины).Я планирую взять биграммы, триграммы документа и проверить, существует ли он в словаре (wordnet).Есть ли лучший способ добиться этого.

Ниже приведен пример текста.Я хочу идентифицировать сущности (показанные в двойных кавычках)

Ответы [ 3 ]

1 голос
/ 04 сентября 2010

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

Я не могу дать вам простой ответ "сделай это", но вот несколько советов на моей голове:

  • Я думаю, что использование WordNet могло бы сработать (хотя я не уверен, откуда биграммы / триграммы в него входят), но вы должны рассматривать поиск WordNet как часть гибридной системы, а не как первоочередную задачу для определения именованных сущностей
  • затем начните с применения некоторых простых критериев здравого смысла (последовательности заглавных слов; попробуйте в них использовать часто встречающиеся в нижнем регистре функциональные слова, такие как 'of'; последовательности, состоящие из "известного названия" плюс слова (заглавных букв) );
  • ищите последовательности слов, которые, по статистике, вы не ожидали бы случайно оказаться рядом друг с другом в качестве кандидатов на сущности;
  • Вы можете встроить динамический поиск в Интернете? (ваша система обнаруживает заглавную последовательность «IBM» и видит, например, что она находит в википедии запись с текстовым шаблоном «IBM is ... [organization | company | ...]».
  • посмотрите, если что-нибудь здесь и в литературе по "извлечению информации" дает вам некоторые идеи: http://www -nlpir.nist.gov / related_projects / muc / разбирательство / muc_7_toc.html

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

0 голосов
/ 05 сентября 2010

Кто-то еще задал похожий вопрос о , как найти "интересные" слова в корпусе текста . Вы должны прочитать ответы. В частности, ответ Боло указывает на интересную статью, которая использует плотность появления слова, чтобы решить, насколько это важно - используя наблюдение, что, когда текст говорит о чем-то, он обычно ссылается на это что-то довольно часто. Эта статья интересна тем, что метод не требует предварительных знаний о тексте, который обрабатывается (например, вам не нужен словарь, нацеленный на конкретную лексику).

В статье предлагается два алгоритма.

Первый алгоритм оценивает отдельные слова (такие как «Федерация» или «Трек» и т. Д.) В соответствии с их измеренной важностью. Это просто реализовать, и я мог бы даже представить (не очень элегантную) реализацию в Python.

Второй алгоритм более интересен, поскольку он извлекает существительные фразы (такие как «Звездный путь» и т. Д.), Полностью игнорируя пробелы и используя древовидную структуру, чтобы решить, как разбивать именные фразы. Результаты этого алгоритма применительно к основополагающему тексту Дарвина об эволюции очень впечатляют. Тем не менее, я признаю, что реализация этого алгоритма потребовала бы немного больше внимания, так как описание, данное в статье, довольно неуловимо, и что еще авторы, кажется, немного трудно отследить. Тем не менее, я не тратил много времени, так что, возможно, вам повезет больше.

0 голосов
/ 04 сентября 2010

Если я правильно понимаю, вы хотите извлечь подстроки, разделенные двойными кавычками ("). Вы можете использовать группы перехвата в регулярных выражениях:

    String text = "Vulcans are a humanoid species in the fictional \"Star Trek\"" +
        " universe who evolved on the planet Vulcan and are noted for their " +
        "attempt to live by reason and logic with no interference from emotion" +
        " They were the first extraterrestrial species officially to make first" +
        " contact with Humans and later became one of the founding members of the" +
        " \"United Federation of Planets\"";
    String[] entities = new String[10];                 // An array to hold matched substrings
    Pattern pattern = Pattern.compile("[\"](.*?)[\"]"); // The regex pattern to use
    Matcher matcher = pattern.matcher(text);            // The matcher - our text - to run the regex on
    int startFrom   = text.indexOf('"');                // The index position of the first " character
    int endAt       = text.lastIndexOf('"');            // The index position of the last " character
    int count       = 0;                                // An index for the array of matches
    while (startFrom <= endAt) {                        // startFrom will be changed to the index position of the end of the last match
        matcher.find(startFrom);                        // Run the regex find() method, starting at the first " character
        entities[count++] = matcher.group(1);           // Add the match to the array, without its " marks
        startFrom = matcher.end();                      // Update the startFrom index position to the end of the matched region
    }

ИЛИ написать" парсер "с функциями String:

    int startFrom = text.indexOf('"');                              // The index-position of the first " character
    int nextQuote = text.indexOf('"', startFrom+1);                 // The index-position of the next " character
    int count = 0;                                                  // An index for the array of matches
    while (startFrom > -1) {                                        // Keep looping as long as there is another " character (if there isn't, or if it's index is negative, the value of startFrom will be less-than-or-equal-to -1)
        entities[count++] = text.substring(startFrom+1, nextQuote); // Retrieve the substring and add it to the array
        startFrom = text.indexOf('"', nextQuote+1);                 // Find the next " character after nextQuote
        nextQuote = text.indexOf('"', startFrom+1);                 // Find the next " character after that
    }

В обоих примерах образец текста жестко задан для примера, и предполагается, что присутствует одна и та же переменная (переменная String с именем text).

Если вы хотите проверить содержимое массива entities:

    int i = 0;
    while (i < count) {
        System.out.println(entities[i]);
        i++;
    }

Я должен предупредить вас, могут возникнуть проблемы с граничными / граничными случаями (т. Е. Когда символ "в начале или в конце строки. Эти примеры не будут работать должным образом, если четность символов «неравномерна (т. е. если в тексте есть нечетное число символов). Вы можете использоватьПредварительная проверка на четность:

    static int countQuoteChars(String text) {
        int nextQuote = text.indexOf('"');              // Find the first " character
        int count = 0;                                  // A counter for " characters found
        while (nextQuote != -1) {                       // While there is another " character ahead
            count++;                                    // Increase the count by 1
            nextQuote = text.indexOf('"', nextQuote+1); // Find the next " character
        }
        return count;                                   // Return the result
    }

    static boolean quoteCharacterParity(int numQuotes) {
        if (numQuotes % 2 == 0) { // If the number of " characters modulo 2 is 0
            return true;          // Return true for even
        }
        return false;             // Otherwise return false
    }

Обратите внимание, что если numQuotes равно 0, этот метод по-прежнему возвращает true (потому что 0 по модулю любое число равно 0, поэтому (count % 2 == 0) будетбыть true) хотя вы не хотели бы идти ахпрекратите синтаксический анализ, если «символов» нет, поэтому вам нужно где-нибудь проверить это условие.

Надеюсь, это поможет!

...