Вопрос

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

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

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"

Это было полезно?

Решение

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

Я не могу дать вам простой «Делай этот» ответ, но вот некоторые указатели от вершины головы:

  • Я думаю, что используя Wordnet может работать (не уверен, где входит в него Bigrams / Trigrams), но вы должны просмотреть поиск WORDNET как часть гибридной системы, а не быть всей и концом, чтобы определить именованные объекты.
  • Затем начните с применения некоторых простых критериев здравого смысла (последовательности заглавных слов; попробуйте и приспособиться к частоте функциональные слова строчных строк, таких как «из» в них; последовательности, состоящие из «известного заголовка» плюс Capital Word (ы));
  • Ищите последовательности слов, которые статистически вы не ожидаете появиться рядом друг с другом случайным в качестве кандидатов на организации;
  • Можете ли вы строить динамический веб-поиск? (Ваша система пятен заглавная последовательность «IBM» и видит, если она находит, например, вход в википедии с текстовым шаблоном «IBM ... [Организация | Компания | ...]».
  • Смотрите ли что-нибудь здесь и в «Извлечении информации» литературу в целом дает вам некоторые идеи: http://www-nlpir.nist.gov/related_projects/muc/prouch/muc_7_toc.html.

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

Другие советы

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

    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
    }

Или напишите «парсер» со строчными функциями:

    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
    }

В обоих, текст образец жестко кодируется ради примера, и одинаковая переменная предполагается, что присутствует (строковая переменная под названием 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Несмотря на то, что вы не хотели бы продолжать расставание, если нет «персонажей, так что вы хотели бы проверить это условие где-то.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top