Извлечения синонимов из онтологии


На мой вопрос о моей онтологии, которая получает синонимы от онтологии с помощью isSynonymOf объекта недвижимости. (Обратите внимание, что моя онтология файла 260 КБ и, как ожидается, станет 500кб). Я использую следующий код для извлечения синонимов. Производительность в терминах время отклика очень низкое. Это занимает много времени(минут) дисплей синонимы. Как я могу улучшить его? Примечание: проблема похоже в алгоритме сходство и iterator.

Вот мой полный код

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;

import org.apache.jena.ontology.Individual;
import org.apache.jena.ontology.OntModel;
import org.apache.jena.ontology.OntModelSpec;
import org.apache.jena.ontology.SymmetricProperty;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.NodeIterator;
import org.apache.jena.util.FileManager;

import xyzWordAnalyzer;
import cde.model.SimilarityModel;
public class ontologyConnector
{
    private static ontologyConnector    instance;
    private static OntModel             ontModel;
    protected static final Sring        SOURCE_FILE = "http://abc.owl";
    protected static final String       NS          = SOURCE_FILE + "abc";

    public static synchronized ontologyConnector getInstance()
    {
        if (instance == null)
        {
            instance = new ontologyConnector();
        }

        return instance;
    }

    public ontologyConnector()
    {
        ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF);
        InputStream in = FileManager.get().open(SOURCE_FILE);
        ontModel.read(in, "");
    }

    public ArrayList<SimilarityModel> getRelatums(String keyword)
    {
        ArrayList<String> list = new ArrayList<String>();

        keyword = keyword.replaceAll(" ", "_");

        SymmetricProperty isSynonymOf = ontModel.getSymmetricProperty("http://www.semanticweb.org/abc#isSynonymOf");

        Iterator<Individual> iterInd = ontModel.listIndividuals();
        while (iterInd.hasNext())
        {
            Individual ind = iterInd.next();
            if (ind.getLocalName().equalsIgnoreCase(keyword))
            {
                NodeIterator iterVal = ind.listPropertyValues(isSynonymOf);
                while (iterVal.hasNext())
                {
                    list.add(iterVal.nextNode().asResource().getLocalName().toString().replace("_", " "));
                }
            }
        }

      list = removeDuplicationfromList(keyword, list);

    // list.remove(keyword);

    ArrayList<SimilarityModel> simList = new ArrayList<SimilarityModel>();

    Double tot = (double) 0;
    WordAnalyzer wa = new WordAnalyzer();

    for (int i = 0; i < list.size(); i++) {
        Double tmpDouble = wa.getSimilarity(keyword.toLowerCase(), 
      list.get(i));

        int tmp = 0;
        if (Double.isNaN(tmpDouble)) {
            // tmpDouble = (double) -200;
            tmp = -200;
        } else {
            tmpDouble *= 100;
            tot += tmpDouble;
            tmp = tmpDouble.intValue();
        }

        SimilarityModel simModel = new SimilarityModel(list.get(i), tmp);
        simList.add(simModel);
    }

    Double avg = tot / simList.size();
    if (!Double.isNaN(avg)) {
        for (int i = 0; i < simList.size(); i++) {
            if (simList.get(i).getSimilarity() == -200) {
                simList.get(i).setSimilarity(avg.intValue());
            }
        }
    }

    return simList;
}

 private ArrayList<String> removeDuplicationfromList(String str, 
  ArrayList<String> list) {
    for (int i = list.size() - 1; i >= 0; i--) {
        if (list.get(i).toString().equalsIgnoreCase(str)) {
            list.remove(i);
        }
      }
     return list;
}

}



154
-1
задан 28 февраля 2018 в 03:02 Источник Поделиться
Комментарии
1 ответ

Дизайн

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


public ArrayList<SimilarityModel> getRelatums(String keyword)

Особенно в API класса, я. е. ее члены Общественного нравится этот метод, вы должны использовать интерфейсы или абстрактные типы, а не конкретных реализаций. Если вы замените ArrayList<SimilarityModel> С List<SimilarityModel>вы можете использовать любую реализацию List что вам нравится, без необходимости менять многие части вашего кода.

Стиль

Ява конвенции для класса имен UpperCamelCase. ontologyConnector должно быть OntologyConnector.


Ваши имена не только непоследователен в капитализации, но и аббревиатура. OntModel должно быть написано как OntologyModel, чтобы соответствовать с OntologyConnector но и потому, что аббревиатуры иногда заставить читателя угадать, что это означает, и таким образом уничтожить кодекса читаемость.


public ArrayList<SimilarityModel> getRelatums(String keyword)

Тип возвращаемого значения свидетельствует о том, что метод возвращает коллекцию SimilarityModelS, но называется getRelatums. Она должна называться getSimilarityModels, если это то, что она действительно делает. Если нет, то название типа SimilarityModel может быть выбран плохо.


Как другие уже отметили в комментариях, для того чтобы вам помочь с проблемой производительности вам нужно добавить больше информации и кода (электронной. г. классы OntModel и SymmetricProperty). Однако, на мой взгляд, еще многое можно улучшить в уже имеющийся код, чтобы сделать его стоит пересмотреть. Пожалуйста, добавьте больше кода, чтобы получить дальнейшие предложения, как повышение производительности.

2
ответ дан 28 февраля 2018 в 03:02 Источник Поделиться