Разбор ресурса Dbpedia в JAVA - PullRequest
       28

Разбор ресурса Dbpedia в JAVA

0 голосов
/ 10 февраля 2019

Используя DBpedia Spotlight , я получаю URI DBpedia.Например,

http://dbpedia.org/resource/Part-of-speech_tagging

Мне нужно запросить этот URI в Java, чтобы он мог вернуть мне несколько json / xml, и я могу получить необходимую информацию из ответа.

Например, в вышеупомянутом URI мне нужно значение dct:subject

Ниже приведен скриншот ответа, который я получаю в браузере.

Subject of Entity

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

В вашем вопросе недостаточно информации о том, чего вы пытаетесь достичь, чтобы обеспечить наилучший путь для достижения этой цели.Вы можете рассмотреть возможность использования Jena или RDF4J / Sesame Frameworks.

Или вы можете просто спросить конечную точку DBpedia о том, что вам нужно, будь то полное описание <http://dbpedia.org/resource/Part-of-speech_tagging>, здесь в формате JSON (как связано с меню «Форматы», отображаемое в вашем экране) или использование URI запроса SPARQL для запроса просто dct:subject значений -

PREFIX dbr: <http://dbpedia.org/resource/>
SELECT DISTINCT ?subject
  WHERE { dbr:Part-of-speech_tagging dct:subject ?subject }
LIMIT 100

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

0 голосов
/ 11 февраля 2019

Я не совсем уверен, какие значения вы ищете, но вы должны быть в состоянии сделать это без каких-либо зависимостей, чтобы очистить то, что вы хотите от источника страницы.Четыре метода Java, представленные ниже, должны дать вам то, что вам нужно (один метод является методом поддержки).

Получение веб-страницы Источник HTML:

Сначала мы получаем HTML-код веб-страницы с помощью метода getWebPageSource () .Этот метод получит весь исходный код HTML, который составляет веб-страницу, расположенную в предоставленной строке ссылок.Источник возвращается в объект интерфейса списка ( Список ).Пример использования:

String sourceLinkString = "http://dbpedia.org/resource/Part-of-speech_tagging";
List<String> pageSource = getWebPageSource(sourceLinkString);

При запуске этого кода переменная списка pageSource будет содержать весь исходный код HTML для предоставленной вами строки веб-ссылки, котораяв данном случае это: "http://dbpedia.org/resource/Part-of-speech_tagging".Если вам нравится, вы можете создать цикл для перебора списка и отобразить его в окне консоли с помощью метода System.out.println () следующим образом:

for (int i = 0; i < pageSource.size(); i++) {
    System.out.println(pageSource.get(i));
}

Получение связанных ссылок с использованием строки ссылки:

Теперь, когда у вас есть источник веб-страницы, вы можете найти и получить нужные данные.Следующий метод - это метод getRelatedLinks () .Этот метод извлекает все ссылки, которые содержатся между специально предоставленными тегами String, где могут находиться нужные ссылки и связаны с предоставленной Reference String .В вашем случае ссылочная строка будет: "rel=\"dct:subject\"".Начальный тег строки будет "href=\"", а конечный тег строки будет "\">".Таким образом, просматривается любая строка источника веб-страницы, которая содержит строку ссылки "rel=\"dct:subject\"", а если в той же строке источника , то предоставленная строка начального тега ("href=\"") и предоставленная строка конечного тега ("\">"), затем текст между этими тегами извлекается.Пример использования:

String sourceLinkString = "http://dbpedia.org/resource/Part-of-speech_tagging";
List<String> pageSource = getWebPageSource(sourceLinkString);
String[] relatedLinksTo = getRelatedLinks("rel=\"dct:subject\"", pageSource, "href=\"", "\">");

Все ссылки, связанные со строкой ссылки: "rel=\"dct:subject\"" теперь будут храниться в переменной String Array с именем relatedLinksTo .Если вы проведете итерацию по массиву и отобразите его содержимое в окне консоли:

// Display Related Links...
for (int i = 0; i < relatedLinksTo.length; i++) {
    System.out.println(relatedLinksTo[i]);
}

, вы увидите:

http://dbpedia.org/resource/Category:Corpus_linguistics
http://dbpedia.org/resource/Category:Markov_models
http://dbpedia.org/resource/Category:Tasks_of_natural_language_processing
http://dbpedia.org/resource/Category:Word-sense_disambiguation

И если вам просто нужны заголовки, которыекаждая ссылка связана со всей строкой ссылки, тогда вы бы сделали это следующим образом:

// Display Related Links Titles...
for (int i = 0; i < relatedLinksTo.length; i++) {
    String rLink = relatedLinksTo[i].substring(relatedLinksTo[i].lastIndexOf(":") + 1);
    System.out.println(rLink);
}

, и в окне консоли вы увидите:

Corpus_linguistics
Markov_models
Tasks_of_natural_language_processing
Word-sense_disambiguation

Этот методиспользует метод поддержки с именем getBetween () , также предоставленный ниже.

Получение определенной ссылки из списка связанных ссылок:

Возможно, вы не захотитевесь список связанных ссылок, но вместо этого просто одна или несколько конкретных ссылок на конкретный заголовок, например: Tasks_of_natural_language_processing.Чтобы получить эту одну или несколько ссылок, вы должны использовать метод getFromRelatedLinksThatContain () .Вот как вы могли бы добиться этого:

String sourceLinkString = "http://dbpedia.org/resource/Part-of-speech_tagging";
List<String> pageSource = getWebPageSource(sourceLinkString);
String[] relatedLinksTo = getRelatedLinks("rel=\"dct:subject\"", pageSource, "href=\"", "\">");
String[] desiredLinks = getFromRelatedLinksThatContain(relatedLinksTo, "Tasks_of_natural_language_processing");

Этот метод требует, чтобы вы передали то, что было возвращено из метода getRelatedLinks () , вместе с желаемым заголовком, для которого вы хотите установить ссылку (*)1081 *).Название должно быть фактическим текстом, содержащимся в любой ссылке.Если бы вы теперь перебирали массив requiredLinks :

for (int i = 0; i < desiredLinks.length; i++) {
    System.out.println(desiredLinks[i]);
}

Вы увидите следующую строку ссылки, отображаемую в окне консоли:

http://dbpedia.org/resource/Category:Tasks_of_natural_language_processing.

Методы ИСПЫТАНИЙ:

<code>/**
 * Returns a List ArrayList containing the page source for the supplied web
 * page link.<br><br>
 *
 * @param link (String) The URL address of the web page to process.<br>
 *
 * @return (List ArrayList) A List ArrayList containing the page source for
 *         the supplied web page link.
 */
public List<String> getWebPageSource(String webLink) {
    if (webLink.equals("")) {
        return null;
    }
    try {
        URL url = new URL(webLink);

        URLConnection yc;
        //If url is a SSL Endpoint (using a Secure Socket Layer such as https)...
        if (webLink.startsWith("https:")) {
            yc = new URL(webLink).openConnection();
            //send request for page data...
            yc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11");
            yc.connect();
        }
        //and if not a SLL Endpoint (just http)...
        else {
            yc = url.openConnection();
        }

        InputStream inputStream = yc.getInputStream();
        InputStreamReader streamReader = null;
        String encoding = null;
        try {
            encoding = yc.getContentEncoding().toLowerCase();
        }
        catch (Exception ex) {
        }
        if (null == encoding) {
            encoding = "UTF-8";
            streamReader = new InputStreamReader(yc.getInputStream(), encoding);
        }
        else {
            switch (encoding) {
                case "gzip":
                    // Is compressed using GZip: Wrap the reader
                    inputStream = new GZIPInputStream(inputStream);
                    streamReader = new InputStreamReader(inputStream);
                    break;
                //streamReader = new InputStreamReader(inputStream);
                case "utf-8":
                    encoding = "UTF-8";
                    streamReader = new InputStreamReader(yc.getInputStream(), encoding);
                    break;
                case "utf-16":
                    encoding = "UTF-16";
                    streamReader = new InputStreamReader(yc.getInputStream(), encoding);
                    break;
                default:
                    break;
            }
        }

        List<String> sourceText;
        try (BufferedReader in = new BufferedReader(streamReader)) {
            String inputLine;
            sourceText = new ArrayList<>();
            while ((inputLine = in.readLine()) != null) {
                sourceText.add(inputLine);
            }
        }
        return sourceText;
    }
    catch (MalformedURLException ex) {
        // Do whatever you want with exception.
        ex.printStackTrace();
    }
    catch (IOException ex) {
        // Do whatever you want with exception.
        ex.printStackTrace();
    }
    return null;
}

/**
 * This method will retrieve all links which are contained between specifically 
 * supplied String Tags where the desired Links may reside between and are related 
 * to the supplied <b>Reference String</b>. A String Start Tag and a String End Tag 
 * would be required as well.<br><br>
 * 
 * So, if any Web Page Source line that contains the Reference String of:<pre>
 * 
 *     "rel=\"dct:subject\""

* * и если в той же строке источника предоставленный стартTag * String (то есть: "href = \" ") и предоставленная строка конечного тега (то есть:" \ ">") найдены, а затем * получен текст между этими тегами.

* * Этот методиспользует метод поддержки с именем getBetween () .

* * @param referenceString (String) Строка ссылки для поиска в любой исходной строке веб-страницы.
* * @parampageSource (List Interface of String) Список, содержащий весь * источник веб-страницы HTML.
** @param requiredLinkStartTag (String) Строка тега Start, в которой может находиться нужная ссылка или ссылки после.Это может быть любая строка.Ссылки извлекаются * между начальным тегом и конечным тегом.
* * @param wantedLinkEndTag (String) Строка конечного тега, в которой ранее может находиться нужная ссылка или ссылки.Это может быть любая строка.Ссылки извлекаются * между начальным тегом и конечным тегом.
* * @return (1D String Array) Строковый массив, содержащий найденные ссылки.
* * @see #getBetween (java.lang.String,java.lang.String, java.lang.String, boolean ...) getBetween () * / public String [] getRelatedLinks (String referenceString, List pageSource, String wantedLinkStartTag, String wantedLinkEndTag) {List links =новый ArrayList <> ();for (int i = 0; i getRelatedLinks () .

* * Этот метод требует использования getRelatedLinks () метод.* * @param relatedArray (1D String Array) Массив, возвращенный методом getRelatedLinks () *.
* * @param requiredStringInLink (String - Letter Case Sensitive) Заголовок строки *, содержащийся в ссылкедля извлечения.
* * @return (1D String Array) Содержит все найденные ссылки.
* * @see #getRelatedLinks (java.lang.String, java.util.List, java.lang.String, java.lang.String) getRelatedLinks () * * / public String [] getFromRelatedLinksThatContain (String [] relatedArray, String wantedStringInLink) {List wantedLinks = new ArrayList <> ();for (int i = 0; i
* Этот метод возвращает все экземпляры подстроки, расположенной между * предоставленной левой строкой и предоставленнойПравая строка, которая может быть найдена * в предоставленной входной строке.
* * @param inputString (String) Строка для поиска подстроки в. * * @Param leftString (String) Что может быть слеваподстроки * мы хотим в основной строке ввода.Иногда требуемая * подстрока может содержаться в самом * начале строки, и, следовательно, * Left-String недоступна.В этом случае вы просто * передаете пустую строку ("") этому параметру, который * в основном сообщает метод этого факта.Null * не может быть предоставлена ​​и в конечном итоге сгенерирует * NullPointerException.* * @param rightString (String) Что может быть справа от подстроки *, которую мы хотим в основной входной строке.* Иногда подстрока, которую вы хотите, может содержаться * в самом конце строки, и поэтому * Right-String недоступна.В этом случае вы просто * передаете пустую строку ("") этому параметру, который * в основном сообщает метод этого факта.Null * не может быть предоставлена ​​и в конечном итоге сгенерирует * NullPointerException.* * @param options (Необязательно - Boolean - 2 параметра):
 *
 *      ignoreLetterCase    - Default is false. This option works against the
 *                            string supplied within the leftString parameter
 *                            and the string supplied within the rightString
 *                            parameter. If set to true then letter case is
 *                            ignored when searching for strings supplied in
 *                            these two parameters. If left at default false
 *                            then letter case is not ignored.
 *
 *      trimFound           - Default is true. By default this method will trim
 *                            off leading and trailing white-spaces from found
 *                            sub-string items. General sentences which obviously
 *                            contain spaces will almost always give you a white-
 *                            space within an extracted sub-string. By setting
 *                            this parameter to false, leading and trailing white-
 *                            spaces are not trimmed off before they are placed
 *                            into the returned Array.
* * @return (1D String Array) Возвращает одномерный массив строк* содержит все подстроки, найденные в предоставленной строке ввода *, которые находятся между предоставленной левой строкой и предоставленной * правой строкой.Вы можете немного сократить этот метод, * возвращая ArrayList List и удаляя код преобразования 'List * to 1D Array' в конце этого метода.Этот * метод изначально сохраняет свои результаты в объекте List * в любом случае.* / public static String [] getBetween (String inputString, String leftString, String rightString, boolean ... options) {// Ничего не вернуть, если ничего не было предоставлено.if (inputString.equals ("") || (leftString.equals ("") && rightString.equals (""))) {return null;} // Готовим необязательные параметры, если таковые имеются.// Если ничего не указано, используйте Defaults ... boolean ignoreCase = false;// По умолчанию.логическое trimFound = true;// По умолчанию.if (options.length> 0) {if (options.length> = 1) {ignoreCase = options [0];} if (options.length> = 2) {trimFound = options [1];}} // Удаляем любые управляющие символы ASCII из // предоставленной строки (если они существуют).String modString = inputString.replaceAll ("\\ p {Cntrl}", "");// Установить объект массива List String для хранения // найденных подстрок между предоставленной левой // строкой и предоставленной правой строкой.List list = new ArrayList <> ();// Используем Pattern Matching, чтобы найти наши возможные подстроки в предоставленной Input String.Строка regEx = Pattern.quote (leftString) + (! RightString.equals ("")? "(. *?)": "(. *)?") + Pattern.quote (rightString);if (ignoreCase) {regEx = "(? i)" + regEx;} Pattern pattern = Pattern.compile (regEx);Matcher matcher = pattern.matcher (modString);while (matcher.find ()) {// Добавить найденные подстроки в список.Строка найдена = matcher.group (1);if (trimFound) {found = found.trim ();} list.add (найдено);} String [] res;// Преобразование ArrayList в 1D String Array.// Если список содержит что-то, тогда преобразуем if (list.size ()> 0) {res = new String [list.size ()];res = list.toArray (res);} // В противном случае вернуть Null.else {res = null;} // Возвращаем String Array.вернуть Res;}

Или ... Используйте SPARQL или любой другой желаемый парсер, например, jSON.

...