package com.cyc.tool.kbtaxonomy.viewer;
/*
* #%L
* KBTaxonomyViewer2015
* %%
* Copyright (C) 2015 Cycorp, Inc
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import com.cyc.tool.conceptfinder.ConceptMatch;
import com.cyc.tool.conceptfinder.ConceptSpace;
import com.cyc.tool.distributedrepresentations.GoogleNewsW2VOpenCycSubspace;
import com.cyc.tool.distributedrepresentations.Word2VecSpace;
import com.cyc.tool.owltools.OpenCycContent;
import com.cyc.tool.owltools.OpenCycOwl;
import com.cyc.tool.kbtaxonomy.builder.NonCycConcept;
import com.cyc.tool.kbtaxonomy.builder.OpenCycConcept;
import com.cyc.tool.kbtaxonomy.builder.Taxonomy;
import com.cyc.tool.kbtaxonomy.builder.TaxonomyFromOpenCyc;
import com.cyc.tool.kbtaxonomy.builder.KBConcept;
import static com.cyc.tool.kbtaxonomy.viewer.JavascriptGraphs.jsPackages;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
/**
* <P>
* OpenCycViewer contains methods for implementing a Taxonomy Viewer with OpenCyc concepts and
* the GoogleNew W2V space.
*/
public class OpenCycViewer implements ConceptViewer {
/**
* A Collection of KBConcept instances that are matches in the W2V space
*/
protected static final Collection<KBConcept> nearestOCyc = new ArrayList<>();
/**
* A collection of Strings to display for matched OpenCyc concepts
*/
final static protected Collection<String> selectedOCycConcepts = new ArrayList<>();
static final Set<String> nonGraphingConcepts = new HashSet<>(Arrays.asList(
"Event", "Homeotherm", "InformationTransferEvent", "ControllingSomething",
"IntrinsicStateChangeEvent", "PhysicalCreationEvent", "Event-Localized",
"Conveying-Generic",
// "BodyMovementEvent",
"Movement-TranslationEvent",
"AnimalActivity", "MovementEvent", "PhysicalEvent", "AtLeastPartiallyMentalEvent",
"CompositePhysicalAndMentalEvent", "Animal", "LocomotionEvent", "SocialOccurrence",
"CreationEvent", "TransportationEvent", "PhysicalContactEvent", "Person",
"InformationTransferPhysicalEvent"
));
private String nearestOCycQuery;
private InvertedIndex oCycIndex;
private OpenCycOwl ocyc;
private ConceptSpace ocycConceptSpace;
//// Constructors
/**
* Creates a new instance of OpenCycViewer.
*/
public OpenCycViewer() {
}
@Override
public String addConceptSearchForm(String page) {
page += "<form action='?' method='get'>\n" + " concepts: <input type='text' name='searchterms'><input type=\"submit\" value=\"Submit\">\n" + "</form>\n";
return page;
}
@Override
public String addNearestTermSearchForm(String page) {
page += "<form action='?' method='get'>\n" + " nearby terms: <input type='text' name='nearestterms'><input type=\"submit\" value=\"Submit\"></p>\n" + "</form>\n";
return page;
}
@Override
public String addOptionsSelectForm(String page) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String addQuerySearchForm(String page) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String addSearchSelectForm(String page) {
page += "<select form='searchSelectorForm' name='searchSelect'>\n";
page += "<option value='nearestterms' title='Search for nearest OpenCyc concepts in a Word2Vec space'>Nearby Term Search</option>\n";
page += "<option value='searchterms' title='Perform a lexical search to find OpenCyc concepts'>Lexical Match Search</option>\n";
page += "</select>\n";
page += "<form action'?' method='get' id='searchSelectorForm'>\n";
page += "<input type='text' name='inputText'><input type='submit' >\n";
page += "</form>\n";
return page;
}
@Override
public String addXMLLoadForm(String page) {
throw new UnsupportedOperationException("Not supported"); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void clearLists() {
nearestOCyc.clear();
nearestOCycQuery = null;
selectedOCycConcepts.clear();
}
@Override
public String getFeatureList(Collection<NonCycConcept> sel) {
throw new UnsupportedOperationException("Not supported"); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String getFileN() {
throw new UnsupportedOperationException("Not supported"); //To change body of generated methods, choose Tools | Templates.
}
@Override
public InvertedIndex getIndex() {
return oCycIndex;
}
@Override
public Set<NonCycConcept> getLastFileConcepts() {
throw new UnsupportedOperationException("Not supported"); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String getLastSaveF() {
throw new UnsupportedOperationException("Not supported"); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Collection<KBConcept> getNearestOCyc() {
return nearestOCyc;
}
@Override
public String getNearestOCycQuery() {
return nearestOCycQuery;
}
@Override
public void setNearestOCycQuery(String query) {
nearestOCycQuery = query;
}
@Override
public String getPageEpilogue(WebParams params, String page) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String getPageFileList(String page) {
throw new UnsupportedOperationException("Not supported"); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String getPageOpenCycList(String page, Collection<KBConcept> found) {
page += "<hr><div style=\"background-color: #f5eeff;\">\n" + "<h2>OpenCyc Concepts</h2>\n";
page += found.
stream().
filter((KBConcept v) -> v instanceof OpenCycConcept).
map((KBConcept v) -> (OpenCycViewer.nonGraphingConcepts.contains(v.getCycL()) ? v.getNameUnclick() : v.toAnchor())).
collect(Collectors.joining(", \n")) + "<hr></div>";
return page;
}
@Override
public String getPagePrologue(WebParams params, String version) {
String page = "<!DOCTYPE html>"
+ "<meta charset=\"utf-8\">\n"
+ "<head>\n";
page += JavascriptGraphs.cssLinks();
page += jsPackages(params);
// final String conceptDetailEnabledParam = params.serialize().getConceptDetailEnabled(true);
page += "</head>\n"
+ "<body><h1>OpenCyc Concepts Search</h1>\n"
+ "Version " + version + "<br>";
return page;
}
@Override
public String getPageTeamConceptList(String page, Collection<KBConcept> found) {
throw new UnsupportedOperationException("Not supported"); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String getPathToJSON() {
throw new UnsupportedOperationException("Not supported"); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void setPathToJSON(String aPathToJSON) {
throw new UnsupportedOperationException("Not supported"); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Set<NonCycConcept> getSelectedConcepts() {
throw new UnsupportedOperationException("Not supported"); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void getSelectedConceptsFromConceptSearch(String get) {
throw new UnsupportedOperationException("Not supported"); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void getSelectedConceptsFromParameters(String get) {
throw new UnsupportedOperationException("Not supported"); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Collection<String> getSelectedOCycConcepts() {
return selectedOCycConcepts;
}
@Override
public void getSelectedOCycConceptsFromParameters(String parameter) {
selectedOCycConcepts.clear();
for (String p : parameter.split("\\s+")) {
selectedOCycConcepts.add(p);
}
}
@Override
public void loadTaxonomy() {
try {
Taxonomy myOpenCycTaxonomy = TaxonomyFromOpenCyc.get();
System.out.println("Loaded OpenCyc Taxonomy with " + myOpenCycTaxonomy.getNodeCount() + " concepts");
oCycIndex = new InvertedIndex(myOpenCycTaxonomy);
} catch (IOException | OWLOntologyCreationException ex) {
Logger.getLogger(OpenCycViewer.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public void loadXMLQueryFile(String file) {
throw new UnsupportedOperationException("Not supported"); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void prepareNearOpenCycTerms() {
selectedOCycConcepts.clear();
nearestOCyc.clear();
Collection added = new HashSet<String>();
try {
setUpSpaceIfNeeded();
List<ConceptMatch> nearTerms = new ArrayList<>();
nearTerms = ocycConceptSpace.findNearestNForPosition(nearestOCycQuery, 40, t -> String.join(" | ", ocyc.conceptsFor(t)));
for (ConceptMatch match : nearTerms) {
System.out.println("Match:" + match);
Arrays.asList(match.getConcept().split("\\s*\\|\\s*"))
.forEach(concept -> {
OpenCycContent instance;
if (!added.contains(concept)) {
added.add(concept);
try {
instance = new OpenCycContent(concept.replaceAll("http://sw.opencyc.org/concept/", ""));
String label = instance.getLabelForConcept();
Set<String> nlNames = new HashSet<>();
nlNames.add(label.replaceAll("#\\$", ""));
nearestOCyc.add(OpenCycConcept.create(label.replaceAll("#\\$", ""), nlNames, concept.replaceAll("http://sw.opencyc.org/concept/", "")));
// selectedOCycConcepts.add(label.replaceAll("#\\$", ""));
} catch (OWLOntologyCreationException ex) {
Logger.getLogger(OpenCycViewer.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
} catch (OWLOntologyCreationException | IOException | Word2VecSpace.NoWordToVecVectorForTerm ex) {
Logger.getLogger(OpenCycViewer.class
.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public Set<NonCycConcept> prepareNonCycConceptsFromNearOpenCycTerms(Collection<KBConcept> nearestOCyc) {
throw new UnsupportedOperationException("Not supported"); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void setUpSpaceIfNeeded() throws IOException, OWLOntologyCreationException {
if (ocyc == null) {
ocyc = new OpenCycOwl();
}
if (ocycConceptSpace == null) {
ocycConceptSpace = new ConceptSpace(GoogleNewsW2VOpenCycSubspace.get());
}
}
}