/*******************************************************************************
* Copyright 2016
* Ubiquitous Knowledge Processing (UKP) Lab
* Technische Universität Darmstadt
*
* 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.
******************************************************************************/
package de.tudarmstadt.ukp.uby.lmf.api.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.FileNotFoundException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.dom4j.DocumentException;
import org.junit.Test;
import de.tudarmstadt.ukp.lmf.api.Uby;
import de.tudarmstadt.ukp.lmf.model.core.LexicalEntry;
import de.tudarmstadt.ukp.lmf.model.core.Lexicon;
import de.tudarmstadt.ukp.lmf.model.core.Sense;
import de.tudarmstadt.ukp.lmf.model.enums.ELabelTypeSemantics;
import de.tudarmstadt.ukp.lmf.model.enums.ELanguageIdentifier;
import de.tudarmstadt.ukp.lmf.model.enums.EPartOfSpeech;
import de.tudarmstadt.ukp.lmf.model.meta.SemanticLabel;
import de.tudarmstadt.ukp.lmf.model.multilingual.SenseAxis;
import de.tudarmstadt.ukp.lmf.model.semantics.SemanticArgument;
import de.tudarmstadt.ukp.lmf.model.semantics.SemanticPredicate;
import de.tudarmstadt.ukp.lmf.model.semantics.SynSemArgMap;
import de.tudarmstadt.ukp.lmf.model.semantics.Synset;
import de.tudarmstadt.ukp.test.resources.UbyTestDbProvider;
/**
* @author Eckle-Kohler
* @author Yevgen Chebotar
* Unit tests for UBY-API methods on in-memory test database
*
*/
public class UbyTest
{
private final Uby uby;
public UbyTest() throws FileNotFoundException, DocumentException, IllegalArgumentException{
UbyTestDbProvider testDbProvider = new UbyTestDbProvider();
this.uby = testDbProvider.getUby();
}
@Test
public void testLexicons() throws IllegalArgumentException{
List<String> lexiconNames = uby.getLexiconNames();
assertTrue(lexiconNames.contains("FrameNet"));
assertTrue(lexiconNames.contains("VerbNet"));
assertTrue(lexiconNames.contains("WordNet"));
assertTrue(lexiconNames.contains("Wiktionary"));
assertTrue(lexiconNames.contains("Wikipedia"));
assertTrue(lexiconNames.contains("OmegaWikideu"));
List<Lexicon> lexicons = uby.getLexicons();
assertEquals(lexiconNames.size(), lexicons.size());
for(Lexicon lexicon : lexicons){
String name = lexicon.getName();
assertTrue(lexiconNames.contains(name));
assertEquals(uby.getLexiconByName(name).getId(), lexicon.getId());
}
lexicons = uby.getLexiconsByLanguage(ELanguageIdentifier.ENGLISH);
assertEquals(lexicons.size(), 5);
assertEquals(lexicons.get(0).getLexicalEntries().get(0)
.getLemma().getFormRepresentations().get(0).getLanguageIdentifier(), ELanguageIdentifier.ENGLISH);
}
@Test
public void testLexicalEntries() throws IllegalArgumentException{
Lexicon lexicon = uby.getLexiconByName("FrameNet");
List<LexicalEntry> lexEntries = uby.getLexicalEntries("run", lexicon);
assertEquals(lexEntries.size(), 1);
LexicalEntry lexEntry = lexEntries.get(0);
lexEntry = uby.getLexicalEntryById(lexEntry.getId());
lexEntry = uby.getLexicalEntries(lexEntry.getLemmaForm(),
lexEntry.getPartOfSpeech(), lexicon).get(0);
assertEquals(lexEntry.getId(), "FN_LexicalEntry_4417");
assertEquals(lexEntry.getPartOfSpeech(), EPartOfSpeech.verb);
List<Lexicon> lexicons = uby.getLexicons();
for(Lexicon l : lexicons){
Iterator<LexicalEntry> iter = uby.getLexicalEntryIterator(l);
int i = 0;
while(iter.hasNext()){
iter.next();
i++;
}
assertEquals(i, l.getLexicalEntries().size());
}
lexEntries = uby.getLexicalEntries("question", null);
Set<String> lexNames = new HashSet<String>();
for(LexicalEntry le : lexEntries){
assertEquals(le.getLemmaForm(), "question");
lexNames.add(le.getLexicon().getName());
}
assertTrue(lexNames.contains("VerbNet"));
assertTrue(lexNames.contains("Wiktionary"));
lexEntries = uby.getLexicalEntriesByLemmaPrefix("ques", EPartOfSpeech.noun, null);
assertEquals(lexEntries.size(), 2);
}
@Test
public void testSenses() throws IllegalArgumentException{
List<Lexicon> lexicons = uby.getLexicons();
for(Lexicon l : lexicons){
Iterator<Sense> iter = uby.getSenseIterator(l);
int i = 0;
String prefix = "";
while(iter.hasNext()){
Sense sense = iter.next();
if(prefix.isEmpty()){
prefix = sense.getId().split("_")[0];
}
i++;
}
int j = 0;
for(LexicalEntry le : l.getLexicalEntries()){
j += le.getSenses().size();
}
assertEquals(i, j);
assertEquals(uby.getSensesbyIdPattern(prefix).size(), i);
}
Sense sense = uby.getSenseById("VN_Sense_2");
assertEquals(sense.getIndex(), 2);
assertEquals(sense.getSenseExamples().get(0).getTextRepresentations()
.get(0).getWrittenText(), "I interrogated him as a suspect.");
assertEquals(sense.getSemanticLabels().get(0).getType(), ELabelTypeSemantics.verbnetClass);
List<Sense> extSenses = uby.getSensesByOriginalReference("FrameNet 1.5 lexical unit ID", "10035");
assertEquals(extSenses.size(), 1);
for(Sense s : extSenses){
assertEquals(s.getLexicalEntry().getLexicon().getName(), "FrameNet");
}
extSenses = uby.getSensesByOriginalReference("VerbNet v3.1", "question_interrogate-37.1.3");
assertEquals(extSenses.size(), 3);
int i = 0;
for(Sense s : extSenses){
assertEquals(s.getLexicalEntry().getLexicon().getName(), "VerbNet");
assertEquals(i, s.getIndex());
i++;
}
extSenses = uby.getSensesByOriginalReference("WordNet 3.0 part of speech and sense key", "[POS: verb] question%2:32:03::");
assertEquals(extSenses.size(), 1);
assertEquals(extSenses.get(0).getIndex(), 1);
assertEquals(extSenses.get(0).getLexicalEntry().getLexicon().getName(), "WordNet");
extSenses = uby.getSensesByOriginalReference("Wiktionary sense key", "49890:1:2");
assertEquals(extSenses.get(0).getId(), "WktEn_sense_2");
extSenses = uby.getSensesByOriginalReference("OW SynTrans ID", "209021");
assertEquals(extSenses.get(0).getId(), "OW_deu_Sense_4143");
Lexicon lexicon = new Lexicon();
lexicon.setName("WordNet");
extSenses = uby.getSensesByOriginalReference("WordNet 3.0 part of speech and sense key", "[POS: verb] question%2:32:03::", lexicon);
assertEquals(extSenses.size(), 1);
assertEquals(extSenses.get(0).getIndex(), 1);
assertEquals(extSenses.get(0).getLexicalEntry().getLexicon().getName(), "WordNet");
Lexicon lexicon1 = new Lexicon();
lexicon1.setName("FrameNet");
extSenses = uby.getSensesByOriginalReference("WordNet 3.0 part of speech and sense key", "[POS: verb] question%2:32:03::", lexicon1);
assertEquals(extSenses.size(), 0);
}
@Test
public void testSynsets() throws IllegalArgumentException{
Lexicon lexicon = uby.getLexiconByName("WordNet");
Iterator<Synset> synsetIterator = uby.getSynsetIterator(lexicon);
int i = 0;
while(synsetIterator.hasNext()){
Synset synset = synsetIterator.next();
Synset synset2 = uby.getSynsetById(synset.getId());
assertEquals(synset.getDefinitionText(), synset2.getDefinitionText());
assertEquals(synset.getId(), synset2.getId());
i++;
}
assertEquals(i,6);
Synset extSynset = uby.getSynsetByOriginalReference("WordNet 3.0 part of speech and synset offset", "[POS: verb] 867409");
assertEquals(extSynset.getId(), "WN_Synset_86301");
}
@Test
public void testSenseAxes() throws IllegalArgumentException{
List<SenseAxis> senseAxes = uby.getSenseAxes();
assertEquals(senseAxes.size(), 6);
Set<String> senseAxisIds = new HashSet<String>();
for(SenseAxis senseAxis : senseAxes){
senseAxisIds.add(senseAxis.getId());
}
Iterator<SenseAxis> senseAxisIterator = uby.getSenseAxisIterator();
int i = 0;
while(senseAxisIterator.hasNext()){
SenseAxis senseAxis = senseAxisIterator.next();
assertTrue(senseAxisIds.contains(senseAxis.getId()));
i++;
}
assertEquals(i,6);
senseAxes = uby.getSenseAxesByIdPattern("AnoEx");
assertEquals(senseAxes.size(), 6);
senseAxes = uby.getSenseAxesByIdPattern("AnoEx_SenseAxis_7");
assertEquals(senseAxes.size(), 1);
assertEquals(senseAxes.get(0).getSenseOne().getId(), "WN_Sense_2");
Sense sense = uby.getSenseById("WktEn_sense_3");
senseAxes = uby.getSenseAxesBySense(sense);
assertEquals(senseAxes.size(), 1);
assertEquals(senseAxes.get(0).getSenseTwo().getId(), "WN_Sense_7");
Sense sense2 = uby.getSenseById("WN_Sense_7");
assertTrue(uby.hasSensesAxis(sense, sense2));
Sense sense3 = uby.getSenseById("VN_Sense_2");
assertFalse(uby.hasSensesAxis(sense, sense3));
}
@Test
public void testSemanticPredicates() throws IllegalArgumentException{
Lexicon lexicon = uby.getLexiconByName("FrameNet");
List<SemanticPredicate> semanticPredicates = uby.getSemanticPredicates(lexicon);
Iterator<SemanticPredicate> semanticPredicateIterator = uby.getSemanticPredicateIterator(lexicon);
assertEquals(semanticPredicates.size(),3);
Set<String> semanticPredicateIds = new HashSet<String>();
for(SemanticPredicate semanticPredicate : semanticPredicates){
semanticPredicateIds.add(semanticPredicate.getId());
}
assertTrue(semanticPredicateIds.contains("FN_SemanticPredicate_29"));
assertTrue(semanticPredicateIds.contains("FN_SemanticPredicate_700"));
assertTrue(semanticPredicateIds.contains("FN_SemanticPredicate_591"));
int i = 0;
while(semanticPredicateIterator.hasNext()){
SemanticPredicate semanticPredicate = semanticPredicateIterator.next();
assertTrue(semanticPredicateIds.contains(semanticPredicate.getId()));
i++;
}
assertEquals(i, 3);
SemanticPredicate semanticPredicate = uby.getSemanticPredicateById("VN_SemanticPredicate_500");
List<SemanticArgument> semanticArguments = semanticPredicate.getSemanticArguments();
assertEquals(semanticArguments.size(),2);
Set<String> semanticRoles = new HashSet<String>();
for(SemanticArgument semanticArgument : semanticArguments){
SemanticArgument semanticArgument2 = uby.getSemanticArgumentById(semanticArgument.getId());
semanticRoles.add(semanticArgument2.getSemanticRole());
}
assertTrue(semanticRoles.contains("Theme[+animate|+machine]"));
assertTrue(semanticRoles.contains("Location[+concrete]"));
}
@Test
public void testSemanticLabels(){
List<SemanticLabel> semanticLabels = uby.getSemanticLabelsbySenseId("VN_Sense_2430");
assertEquals(semanticLabels.size(),1);
SemanticLabel semanticLabel = semanticLabels.get(0);
assertEquals(semanticLabel.getLabel(),"run-51.3.2");
semanticLabels = uby.getSemanticLabelsbySenseIdbyType("WN_Sense_2", "semanticField");
assertEquals(semanticLabels.size(), 1);
semanticLabel = semanticLabels.get(0);
assertEquals(semanticLabel.getLabel(), "verb.communication");
semanticLabels = uby.getSemanticLabelsbySenseIdbyType("WN_Sense_2", "verbnetClass");
assertEquals(semanticLabels.size(), 0);
}
@Test
public void testSynSemArgMaps(){
List<SynSemArgMap> synSemArgMaps = uby.getSynSemArgMaps();
assertEquals(synSemArgMaps.size(), 14);
boolean found = false;
for(SynSemArgMap synSemArgMap : synSemArgMaps){
System.out.println(synSemArgMap.getSyntacticArgument()+" "+synSemArgMap.getSemanticArgument());
if(synSemArgMap.getSyntacticArgument().getId().equals("VN_SyntacticArgument_7") &&
synSemArgMap.getSemanticArgument().getId().equals("VN_SemanticArgument_7")){
found = true;
break;
}
}
assertTrue(found);
}
}