Updating stanford corenlp to 4.3.2; adding more languages

There are models for Spanish, that have been added now. Also the
Hungarian language has been added to the list of supported
languages (for tesseract mainly, no nlp models)
This commit is contained in:
eikek
2021-11-20 14:31:39 +01:00
parent 20fc9955ba
commit 501c6f2988
18 changed files with 162 additions and 40 deletions

View File

@ -45,15 +45,16 @@ object DateFind {
private[this] val jpnChars =
("年月日" + MonthName.getAll(Language.Japanese).map(_.mkString).mkString).toSet
private def splitWords(text: String, lang: Language): Stream[Pure, Word] = {
private[date] def splitWords(text: String, lang: Language): Stream[Pure, Word] = {
val stext =
if (lang == Language.Japanese) {
text.map(c => if (jpnChars.contains(c)) c else ' ')
} else text
TextSplitter
.splitToken(stext, " \t.,\n\r/年月日".toSet)
.splitToken(stext, " -\t.,\n\r/年月日".toSet)
.filter(w => lang != Language.Latvian || w.value != "gada")
.filter(w => lang != Language.Spanish || w.value != "de")
}
case class SimpleDate(year: Int, month: Int, day: Int) {
@ -91,6 +92,7 @@ object DateFind {
case Language.French => dmy.or(ymd).or(mdy)
case Language.Italian => dmy.or(ymd).or(mdy)
case Language.Spanish => dmy.or(ymd).or(mdy)
case Language.Hungarian => ymd
case Language.Czech => dmy.or(ymd).or(mdy)
case Language.Danish => dmy.or(ymd).or(mdy)
case Language.Finnish => dmy.or(ymd).or(mdy)

View File

@ -30,6 +30,8 @@ object MonthName {
italian
case Language.Spanish =>
spanish
case Language.Hungarian =>
hungarian
case Language.Swedish =>
swedish
case Language.Norwegian =>
@ -324,4 +326,19 @@ object MonthName {
List("11", "נובמבר"),
List("12", "דצמבר")
)
private val hungarian = List(
List("I", "jan", "január"),
List("II", "febr", "február"),
List("III", "márc", "március"),
List("IV", "ápr", "április"),
List("V", "máj", "május"),
List("VI", "jún", "június"),
List("VII", "júl", "július"),
List("VIII", "aug", "augusztus"),
List("IX", "szept", "szeptember"),
List("X", "okt", "október"),
List("XI", "nov", "november"),
List("XII", "dec", "december")
)
}

View File

@ -29,7 +29,7 @@ object BasicCRFAnnotator {
private[this] val logger = getLogger
// assert correct resource names
List(Language.French, Language.German, Language.English).foreach(classifierResource)
NLPLanguage.all.toList.foreach(classifierResource)
type Annotator = AbstractSequenceClassifier[CoreLabel]
@ -70,6 +70,12 @@ object BasicCRFAnnotator {
"/edu/stanford/nlp/models/ner/german.distsim.crf.ser.gz"
case Language.English =>
"/edu/stanford/nlp/models/ner/english.conll.4class.distsim.crf.ser.gz"
case Language.Spanish =>
"/edu/stanford/nlp/models/ner/spanish.ancora.distsim.s512.crf.ser.gz"
// case Language.Italian =>
// "/edu/stanford/nlp/models/ner/italian.crf.ser.gz"
// case Language.Hungarian =>
// "/edu/stanford/nlp/models/ner/hungarian.crf.ser.gz"
})
}
@ -77,12 +83,14 @@ object BasicCRFAnnotator {
private[this] lazy val germanNerClassifier = makeAnnotator(Language.German)
private[this] lazy val englishNerClassifier = makeAnnotator(Language.English)
private[this] lazy val frenchNerClassifier = makeAnnotator(Language.French)
private[this] lazy val spanishNerClassifier = makeAnnotator(Language.Spanish)
def forLang(language: NLPLanguage): Annotator =
language match {
case Language.French => frenchNerClassifier
case Language.German => germanNerClassifier
case Language.English => englishNerClassifier
case Language.Spanish => spanishNerClassifier
}
}

View File

@ -37,6 +37,8 @@ object Properties {
Properties.nerEnglish(regexNerFile)
case Language.French =>
Properties.nerFrench(regexNerFile, highRecall)
case Language.Spanish =>
Properties.nerSpanish(regexNerFile, highRecall)
}
case StanfordNerSettings.RegexOnly(path) =>
Properties.regexNerOnly(path)
@ -88,6 +90,18 @@ object Properties {
"ner.model" -> "edu/stanford/nlp/models/ner/french-wikiner-4class.crf.ser.gz,edu/stanford/nlp/models/ner/english.conll.4class.distsim.crf.ser.gz"
).withRegexNer(regexNerMappingFile).withHighRecall(highRecall)
def nerSpanish(regexNerMappingFile: Option[String], highRecall: Boolean): JProps =
Properties(
"annotators" -> "tokenize, ssplit, mwt, pos, lemma, ner",
"tokenize.language" -> "es",
"mwt.mappingFile" -> "edu/stanford/nlp/models/mwt/spanish/spanish-mwt.tsv",
"pos.model" -> "edu/stanford/nlp/models/pos-tagger/spanish-ud.tagger",
"ner.model" -> "edu/stanford/nlp/models/ner/spanish.ancora.distsim.s512.crf.ser.gz",
"ner.applyNumericClassifiers" -> "true",
"ner.useSUTime" -> "false",
"ner.language" -> "es"
).withRegexNer(regexNerMappingFile).withHighRecall(highRecall)
def regexNerOnly(regexNerMappingFile: Path): JProps =
Properties(
"annotators" -> "tokenize,ssplit"

View File

@ -13,7 +13,7 @@ import docspell.files.TestFiles
import munit._
class DateFindSpec extends FunSuite {
class DateFindTest extends FunSuite {
test("find simple dates") {
val expect = Vector(
@ -179,4 +179,29 @@ class DateFindSpec extends FunSuite {
)
}
test("find spanish dates") {
assertEquals(
DateFind
.findDates("México, Distrito Federal a 15 de Diciembre de 2011", Language.Spanish)
.toVector,
Vector(
NerDateLabel(
LocalDate.of(2011, 12, 15),
NerLabel("15 de Diciembre de 2011", NerTag.Date, 27, 50)
)
)
)
println(DateFind.splitWords("2021-11-19", Language.Spanish).toList)
assertEquals(
DateFind
.findDates("2021-11-19", Language.Spanish)
.toVector,
Vector(
NerDateLabel(
LocalDate.of(2021, 11, 19),
NerLabel("2021-11-19", NerTag.Date, 0, 10)
)
)
)
}
}