Skip to content

Commit 02931dd

Browse files
authored
Merge pull request #39 from jmccrae/issue-28
Issue 28
2 parents 1796fce + 92de2f6 commit 02931dd

12 files changed

Lines changed: 201 additions & 26 deletions

File tree

src/main/scala/org/globalwordnet/wnapi/WordNet.scala

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ case class Lexicon(id : String,
8585
label : String, language : Language, email : String,
8686
license : String, version : String, url : Option[String] = None,
8787
citation : Option[String] = None,
88+
logo : Option[String] = None,
8889
requires : Seq[Requires] = Nil,
8990
entries : Seq[LexicalEntry] = Nil,
9091
synsets : Seq[Synset] = Nil,
@@ -107,7 +108,7 @@ ${synsets.mkString("\n")}"""
107108
}
108109

109110
case class LexicalEntry(id : String, lemma : Lemma, forms : Seq[Form] = Nil, senses : Seq[Sense] = Nil,
110-
syntacticBehaviours : Seq[SyntacticBehaviour] = Nil) extends ExternalEntries with Meta {
111+
syntacticBehaviours : Seq[SyntacticBehaviour] = Nil, index : Option[String] = None) extends ExternalEntries with Meta {
111112
override def toString = s"""LexicalEntry[$id](${(Seq(lemma.toString) ++ forms.map(_.toString) ++ senses.map(_.toString) ++ syntacticBehaviours.map(_.toString)).mkString(", ")})"""
112113
}
113114

@@ -132,7 +133,8 @@ case class Tag(category : String, value : String) {
132133
case class Sense(id : String, synsetRef : String,
133134
senseRelations : Seq[SenseRelation] = Nil, senseExamples : Seq[Example] = Nil,
134135
counts : Seq[Count] = Nil, adjposition : Option[AdjPosition] = None,
135-
subcats : Seq[String] = Nil) extends ExternalSenses with Meta {
136+
subcats : Seq[String] = Nil,
137+
n : Option[Int] = None, lexicalized : Boolean = true) extends ExternalSenses with Meta {
136138
override def toString = s"""Sense[$id](${(Seq(synsetRef) ++ senseRelations.map(_.toString) ++ senseExamples.map(_.toString) ++ counts.map(_.toString)).mkString(", ")})"""
137139
}
138140

@@ -142,6 +144,7 @@ case class Synset(id : String, ili : Option[String] = None,
142144
synsetExamples : Seq[Example] = Nil,
143145
partOfSpeech : Option[PartOfSpeech] = None,
144146
members : Seq[String] = Nil,
147+
lexicalized : Boolean = true,
145148
lexfile : Option[String] = None) extends ExternalSynsets with Meta {
146149
ili match {
147150
case Some("in") if iliDefinition == None =>
@@ -583,6 +586,15 @@ object PartOfSpeech {
583586

584587
sealed class AdjPosition(val shortForm : String)
585588

589+
object AdjPosition {
590+
def fromString(code : String) = code match {
591+
case "a" => attributive
592+
case "p" => predicative
593+
case "ip" => postpositive
594+
case _ => throw new IllegalArgumentException(code + " is not a valid adj position code")
595+
}
596+
}
597+
586598
object attributive extends AdjPosition("a")
587599
object predicative extends AdjPosition("p")
588600
object postpositive extends AdjPosition("ip")

src/main/scala/org/globalwordnet/wnapi/debvisdic.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class DebVisDic(id : String, label : String, language : Language,
2929
private def readWN(elem : Node) : Lexicon = {
3030
val entries = (elem \ "SYNSET").flatMap(readEntry).groupBy(_.id).values.map(mergeEntries).toSeq
3131
val synsets = (elem \ "SYNSET").map(readSynset)
32-
Lexicon(id, label, language, email, license, version, url, citation, Nil, entries, synsets)
32+
Lexicon(id, label, language, email, license, version, url, citation, None, Nil, entries, synsets)
3333
}
3434

3535

src/main/scala/org/globalwordnet/wnapi/json.scala

Lines changed: 68 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,13 @@ object WNJSON extends Format {
343343
(s.senseExamples.map(metaExampleFormat.write).toList match {
344344
case Nil => Map()
345345
case vals => Map("example" -> JsArray(vals:_*))
346+
}) ++
347+
(s.adjposition.map(x => "adjposition" -> JsString(x.shortForm)).toMap) ++
348+
(s.n.map(x => "n" -> JsNumber(x)).toMap) ++
349+
(if(s.lexicalized) Map() else Map("lexicalized" -> JsFalse)) ++
350+
(s.subcats.map(x => JsString(x)).toList match {
351+
case Nil => Map()
352+
case vals => Map("subcat" -> JsArray(vals:_*))
346353
}))
347354
def read(v : JsValue) = v match {
348355
case JsObject(m) =>
@@ -360,7 +367,27 @@ object WNJSON extends Format {
360367
counts=m.getOrElse("count", JsArray()) match {
361368
case JsArray(x) => x.map(metaCountFormat.read)
362369
case _ => throw new WNJsonException("Counts should be a list of values")
370+
},
371+
adjposition=m.get("adjposition").map(stringOrFail).map(AdjPosition.fromString),
372+
n=m.get("n") match {
373+
case Some(JsNumber(x)) => Some(x.toInt)
374+
case Some(JsString(x)) => Some(x.toInt)
375+
case None => None
376+
case _ => throw new WNJsonException("Sense n should be a number or string")
377+
},
378+
lexicalized=m.get("lexicalized") match {
379+
case Some(JsBoolean(b)) => b
380+
case None => true
381+
case _ => throw new WNJsonException("Sense lexicalized should be a boolean")
382+
},
383+
subcats=m.getOrElse("subcat", JsArray()) match {
384+
case JsArray(x) => x.map({
385+
case JsString(s) => s
386+
case _ => throw new WNJsonException("Sense subcat should be a string")
387+
})
388+
case _ => throw new WNJsonException("Sense subcat should be a list of strings")
363389
})
390+
364391
case _ =>
365392
throw new WNJsonException("Sense should be an object")
366393
}
@@ -408,6 +435,10 @@ object WNJSON extends Format {
408435
(e.syntacticBehaviours.map(syntacticBehaviourFormat.write).toList match {
409436
case Nil => Map()
410437
case vals => Map("synBehavior" -> JsArray(vals:_*))
438+
}) ++
439+
(e.index match {
440+
case Some(i) => Map("index" -> JsString(i))
441+
case None => Map()
411442
}))
412443
def read(v : JsValue) = v match {
413444
case JsObject(m) =>
@@ -451,7 +482,12 @@ object WNJSON extends Format {
451482
case JsArray(x) => x.map(syntacticBehaviourFormat.read)
452483
case _ => throw new WNJsonException("Syntactic behaviour must be a list of objects")
453484
},
454-
id=stringOrFail(m.getOrElse("@id", throw new WNJsonException("Lexical entry must have an id"))))
485+
id=stringOrFail(m.getOrElse("@id", throw new WNJsonException("Lexical entry must have an id"))),
486+
index=m.get("index") match {
487+
case Some(JsString(i)) => Some(i)
488+
case Some(_) => None
489+
case None => None
490+
})
455491
case _ =>
456492
throw new WNJsonException("Lexical entry must be an object")
457493
}
@@ -475,7 +511,14 @@ object WNJSON extends Format {
475511
case Nil => Map()
476512
case vals => Map("example" -> JsArray(vals:_*))
477513
}) ++
478-
(s.iliDefinition.map(x => Map("iliDefinition" -> metaILIDefinitionFormat.write(x))).getOrElse(Map())))
514+
(s.iliDefinition.map(x => Map("iliDefinition" -> metaILIDefinitionFormat.write(x))).getOrElse(Map())) ++
515+
((s.members.map(x => JsString(x))).toList match {
516+
case Nil => Map()
517+
case vals => Map("member" -> JsArray(vals:_*))
518+
}) ++
519+
(if(s.lexicalized) Map() else Map("lexicalized" -> JsFalse)) ++
520+
(if(s.lexfile.isDefined) Map("lexfile" -> JsString(s.lexfile.get)) else Map()))
521+
479522
def read(v : JsValue) = v match {
480523
case JsObject(m) =>
481524
Synset(
@@ -494,7 +537,25 @@ object WNJSON extends Format {
494537
case JsArray(x) => x.map(metaExampleFormat.read)
495538
case _ => throw new WNJsonException("Synset exampels must be list of objects")
496539
},
497-
partOfSpeech=m.get("partOfSpeech").map(pos => PartOfSpeech.fromName(stringOrFail(pos))))
540+
partOfSpeech=m.get("partOfSpeech").map(pos => PartOfSpeech.fromName(stringOrFail(pos))),
541+
members=m.getOrElse("member", JsArray()) match {
542+
case JsArray(x) => x.map({
543+
case JsString(s) => s
544+
case _ => throw new WNJsonException("Synset member must be a string")
545+
})
546+
case _ => throw new WNJsonException("Synset member must be a list of strings")
547+
},
548+
lexicalized=m.get("lexicalized") match {
549+
case Some(JsBoolean(b)) => b
550+
case None => true
551+
case _ => throw new WNJsonException("Synset lexicalized must be a boolean" +
552+
" but got: " + m.get("lexicalized"))
553+
},
554+
lexfile=m.get("lexfile") match {
555+
case Some(JsString(s)) => Some(s)
556+
case Some(_) => None
557+
case None => None
558+
})
498559
case _ =>
499560
throw new WNJsonException("Synset must be an object")
500561
}
@@ -520,7 +581,8 @@ object WNJSON extends Format {
520581
case vals => Map("synset" -> JsArray(vals:_*))
521582
}) ++
522583
l.url.map(u => Map("url" -> JsString(u))).getOrElse(Map()) ++
523-
l.citation.map(u => Map("citation" -> JsString(u))).getOrElse(Map()))
584+
l.citation.map(u => Map("citation" -> JsString(u))).getOrElse(Map()) ++
585+
l.logo.map(u => Map("logo" -> JsString(u))).getOrElse(Map()))
524586
def read(v : JsValue) = v match {
525587
case JsObject(m) =>
526588
Lexicon(
@@ -539,7 +601,8 @@ object WNJSON extends Format {
539601
license=stringOrFail(m.getOrElse("license", throw new WNJsonException("License is required on a lexicon"))),
540602
version=stringOrFail(m.getOrElse("version", throw new WNJsonException("Version is required on a lexicon"))),
541603
url=m.get("url").map(stringOrFail),
542-
citation=m.get("citation").map(stringOrFail))
604+
citation=m.get("citation").map(stringOrFail),
605+
logo=m.get("logo").map(stringOrFail))
543606
case _ =>
544607
throw new WNJsonException("Lexicon must be an object")
545608
}

src/main/scala/org/globalwordnet/wnapi/omwn-lmf.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class OMWNLMF(email : String, license : String) extends Format {
6666
attText(elem, "@version", ""),
6767
(elem \ "@owner").headOption.map(_.text),
6868
None,
69+
None,
6970
Nil,
7071
(elem \ "LexicalEntry").map(readEntry),
7172
(elem \ "Synset").map(readSynset))

src/main/scala/org/globalwordnet/wnapi/omwn.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,27 +42,27 @@ object OpenMultilingualWordNet {
4242
}
4343
).groupBy(_._1).view.mapValues(_.map(_._2).groupBy(_._1).view.mapValues(_.map(_._2)).toMap).toMap
4444
enLexicon match {
45-
case Lexicon(id, label, language, email, license, version, url, citation, _, entries, synsets, frames) =>
45+
case Lexicon(id, label, language, email, license, version, url, citation, logo, requires, entries, synsets, frames) =>
4646
Lexicon(id, label, language, email, license, version,
47-
url, citation, Nil, entries,
47+
url, citation, logo, requires, entries,
4848
synsets.map({
49-
case Synset(id, ili, definitions, iliDefinition, synsetRelations, synsetExamples, partOfSpeech, members, lexfile) =>
49+
case Synset(id, ili, definitions, iliDefinition, synsetRelations, synsetExamples, partOfSpeech, members, lexicalized, lexfile) =>
5050
Synset(id, ili, definitions ++ elements.getOrElse(id, Map()).getOrElse("definition", Nil).map({
5151
case (lang, value) => Definition(value, Some(lang))
5252
}), iliDefinition, synsetRelations,
5353
synsetExamples ++ elements.getOrElse(id, Map()).getOrElse("example", Nil).map({
5454
case (lang, value) => Example(value, Some(lang))
55-
}), partOfSpeech, members, lexfile)
55+
}), partOfSpeech, members, lexicalized, lexfile)
5656
}), frames)
5757
}
5858
}
5959

6060
private def buildLexicon(lang : Language, props : Map[String, Seq[(String, String)]],
6161
lexicon : Lexicon) : Lexicon = lexicon match {
62-
case Lexicon(id, label, language, email, license, version, url, citation, _, entries, synsets, frames) =>
62+
case Lexicon(id, label, language, email, license, version, url, citation, logo, requires, entries, synsets, frames) =>
6363
val lemmas = props.getOrElse("lemma", Nil)
6464
Lexicon(
65-
id, label, language, email, license, version, url, citation, Nil,
65+
id, label, language, email, license, version, url, citation, logo, requires,
6666
entries ++ lemmas.map({
6767
case (synset, lemma) =>
6868
LexicalEntry(

src/main/scala/org/globalwordnet/wnapi/plwordnet.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ package serialize {
608608
if(v == "0") {
609609
None
610610
} else {
611-
Some(Emotion(an.toInt,
611+
Some(Emotion(an.toInt,
612612
ArraySeq.unsafeWrapArray(pes.split(",\\s*")).flatMap(EmotionValue.fromPolish),
613613
ArraySeq.unsafeWrapArray(Option(ues).getOrElse("").split(",\\s*")).
614614
flatMap(EmotionValue.fromPolish),

src/main/scala/org/globalwordnet/wnapi/rdf.scala

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ class WNRDF(shortRelations : Boolean = false) extends Format {
161161
(r lit OWL.versionInfo).headOrElse(throw new WNRDFException("Version is required")).getLexicalForm(),
162162
(r lit SCHEMA.url).headOption.map(_.getLexicalForm()),
163163
(r lit SCHEMA.citation).headOption.map(_.getLexicalForm()),
164+
(r lit SCHEMA.logo).headOption.map(_.getLexicalForm()),
164165
Nil, // (r \* WN.requires).map(readRequires).toSeq,
165166
(r \* LIME.entry).map(readLexicalEntry).toSeq,
166167
(r / SKOS.inScheme).map(readSynset).toSeq), r)
@@ -263,7 +264,8 @@ class WNRDF(shortRelations : Boolean = false) extends Format {
263264
(r \* WN.partOfSpeech).headOrElse(throw new WNRDFException("No part of speech for " + r))),
264265
(r \* ONTOLEX.otherForm).map(readForm).toSeq,
265266
(r \* ONTOLEX.sense).map(readSense).toSeq,
266-
(r \* SYNSEM.synBehavior).map(readSynBehavior).toSeq), r)
267+
(r \* SYNSEM.synBehavior).map(readSynBehavior).toSeq,
268+
(r lit ONTOLEX.index).headOption.map(_.getLexicalForm())), r)
267269
}
268270

269271
private def readLemma(canForm : Resource, pos : Resource)(implicit model : Model) : Lemma = {
@@ -312,7 +314,11 @@ class WNRDF(shortRelations : Boolean = false) extends Format {
312314
(r / VARTRANS.source).map(readSenseRelation).toSeq ++
313315
readShortSenseRelation(r),
314316
(r \* WN.example).map(readExample).toSeq,
315-
(r \* WN.count).map(readCount).toSeq), r)
317+
(r \* WN.count).map(readCount).toSeq,
318+
(r lit WN.adjposition).headOption.map(s => AdjPosition.fromString(s.getLexicalForm())),
319+
(r lit WN.subcat).map(_.getLexicalForm()).toSeq,
320+
(r lit WN.n).headOption.map(_.getInt()),
321+
(r lit WN.lexicalized).headOption.map(_.getBoolean()).getOrElse(true)), r)
316322
}
317323

318324
private def readSenseRelation(r : Resource)(implicit model : Model) : SenseRelation = {
@@ -376,7 +382,10 @@ class WNRDF(shortRelations : Boolean = false) extends Format {
376382
(r / VARTRANS.source).map(readSynsetRelation).toSeq ++
377383
readShortSynsetRelation(r),
378384
(r \* WN.example).map(readExample).toSeq,
379-
(r \* WN.partOfSpeech).headOption.map(pos => PartOfSpeech.fromName(pos.getURI().drop(WN.prefix.length)))), r)
385+
(r \* WN.partOfSpeech).headOption.map(pos => PartOfSpeech.fromName(pos.getURI().drop(WN.prefix.length))),
386+
(r lit WN.members).headOption.map(_.getLexicalForm().split(" ").toSeq).getOrElse(Seq()),
387+
(r lit WN.lexicalized).headOption.map(_.getBoolean()).getOrElse(true),
388+
(r lit WN.lexfile).headOption.map(_.getLexicalForm())), r)
380389
}
381390

382391
private def readDefinition(r : Resource)(implicit model : Model) : Definition = {
@@ -563,6 +572,11 @@ class WNRDF(shortRelations : Boolean = false) extends Format {
563572
r + SCHEMA.citation + model.createLiteral(c)
564573
case None =>
565574
}
575+
l.logo match {
576+
case Some(value) =>
577+
r + SCHEMA.logo + model.createLiteral(value)
578+
case None =>
579+
}
566580
r
567581
}
568582

@@ -576,6 +590,11 @@ class WNRDF(shortRelations : Boolean = false) extends Format {
576590
r + ONTOLEX.sense ++ e.senses.map(writeSense)
577591
r + SYNSEM.synBehavior ++ e.syntacticBehaviours.map(writeSyntacticBehavior)
578592
r + RDFS.label + model.createLiteral(e.lemma.writtenForm, lexicon.language.toString())
593+
e.index match {
594+
case Some(i) =>
595+
r + ONTOLEX.index + model.createLiteral(i, lexicon.language.toString())
596+
case None =>
597+
}
579598
r
580599
}
581600

@@ -665,6 +684,22 @@ class WNRDF(shortRelations : Boolean = false) extends Format {
665684
r + WN.example ++ s.senseExamples.map(writeExample)
666685
r + ONTOLEX.isLexicalizedSenseOf + model.createResource(baseUrl + s.synsetRef)
667686
r + WN.count ++ s.counts.map(writeCount)
687+
s.adjposition match {
688+
case None =>
689+
case Some(value) => {
690+
r + WN.adjposition + model.createLiteral(value.shortForm)
691+
}
692+
}
693+
r + WN.subcat ++ s.subcats.map(model.createLiteral(_))
694+
s.n match {
695+
case None =>
696+
case Some(value) => {
697+
r + WN.n + model.createTypedLiteral(value : java.lang.Integer)
698+
}
699+
}
700+
if(!s.lexicalized) {
701+
r + WN.lexicalized + model.createTypedLiteral(false: java.lang.Boolean)
702+
}
668703
r
669704
}
670705

@@ -743,6 +778,15 @@ class WNRDF(shortRelations : Boolean = false) extends Format {
743778
r + WN.partOfSpeech + writePartOfSpeech(pos)
744779
})
745780
r + WN.example ++ s.synsetExamples.map(writeExample)
781+
r + WN.members + model.createLiteral(s.members.mkString(" "))
782+
if(!s.lexicalized) {
783+
r + WN.lexicalized + model.createTypedLiteral(false: java.lang.Boolean)
784+
}
785+
s.lexfile match {
786+
case Some(l) =>
787+
r + WN.lexfile + model.createLiteral(l, lexicon.language.toString())
788+
case None =>
789+
}
746790
r
747791
}
748792

src/main/scala/org/globalwordnet/wnapi/w3c.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class W3C(id : String, label : String, language : Language,
3535
}
3636

3737
def readLexicon(model : Model) : Lexicon = {
38-
Lexicon(id, label, language, email, license, version, url, citation, Nil,
38+
Lexicon(id, label, language, email, license, version, url, citation, None, Nil,
3939
readLexicalEntries(model), readSynsets(model))
4040
}
4141

src/main/scala/org/globalwordnet/wnapi/wndb.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ class WNDB(
131131
version,
132132
url,
133133
citation,
134+
None,
134135
Nil,
135136
buildEntries(items, id, sentences, exc, satellites, counts, filter, lemmas, posMap).toSeq,
136137
buildSynsets(items, id, language, ili, satellites, filter, posMap))

0 commit comments

Comments
 (0)