-
Notifications
You must be signed in to change notification settings - Fork 306
GenderExtractor: Replace hardcoded URI strings with ontology lookups #822
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -1,88 +1,121 @@ | ||||||||||||||||||||||||||||||||||||||||||
| package org.dbpedia.extraction.mappings | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| import org.dbpedia.extraction.config.provenance.DBpediaDatasets | ||||||||||||||||||||||||||||||||||||||||||
| import org.dbpedia.extraction.transform.Quad | ||||||||||||||||||||||||||||||||||||||||||
| import org.dbpedia.extraction.wikiparser._ | ||||||||||||||||||||||||||||||||||||||||||
| import org.dbpedia.extraction.config.mappings.GenderExtractorConfig | ||||||||||||||||||||||||||||||||||||||||||
| import org.dbpedia.extraction.config.provenance.DBpediaDatasets | ||||||||||||||||||||||||||||||||||||||||||
| import org.dbpedia.extraction.ontology.Ontology | ||||||||||||||||||||||||||||||||||||||||||
| import org.dbpedia.extraction.ontology.datatypes.Datatype | ||||||||||||||||||||||||||||||||||||||||||
| import org.dbpedia.extraction.transform.Quad | ||||||||||||||||||||||||||||||||||||||||||
| import org.dbpedia.extraction.util.Language | ||||||||||||||||||||||||||||||||||||||||||
| import org.dbpedia.extraction.wikiparser._ | ||||||||||||||||||||||||||||||||||||||||||
| import util.matching.Regex | ||||||||||||||||||||||||||||||||||||||||||
| import org.dbpedia.extraction.ontology.datatypes.Datatype | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| import scala.language.reflectiveCalls | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| /** | ||||||||||||||||||||||||||||||||||||||||||
| * Extracts the grammatical gender of people using a heuristic. | ||||||||||||||||||||||||||||||||||||||||||
| * Extracts the grammatical gender of people using a pronoun-based heuristic. | ||||||||||||||||||||||||||||||||||||||||||
| */ | ||||||||||||||||||||||||||||||||||||||||||
| class GenderExtractor( | ||||||||||||||||||||||||||||||||||||||||||
| context : { | ||||||||||||||||||||||||||||||||||||||||||
| def mappings : Mappings | ||||||||||||||||||||||||||||||||||||||||||
| def ontology : Ontology | ||||||||||||||||||||||||||||||||||||||||||
| def language : Language | ||||||||||||||||||||||||||||||||||||||||||
| def redirects : Redirects | ||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||
| extends MappingExtractor(context) | ||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||
| private val language = context.language.wikiCode | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| private val pronounMap: Map[String, String] = GenderExtractorConfig.pronounsMap(language) | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| // FIXME: don't use string constant, use context.ontology (or at least RdfNamespace.FOAF) | ||||||||||||||||||||||||||||||||||||||||||
| private val genderProperty = "http://xmlns.com/foaf/0.1/gender" | ||||||||||||||||||||||||||||||||||||||||||
| // FIXME: don't use string constant, use context.ontology (or at least RdfNamespace.RDF) | ||||||||||||||||||||||||||||||||||||||||||
| private val typeProperty = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" | ||||||||||||||||||||||||||||||||||||||||||
| // FIXME: don't use string constant, use context.ontology (or at least DBpediaNamespace.ONTOLOGY) | ||||||||||||||||||||||||||||||||||||||||||
| private val personUri = "http://dbpedia.org/ontology/Person" | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| override val datasets = Set(DBpediaDatasets.Genders) | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| override def extract(node : PageNode, subjectUri : String) : Seq[Quad] = | ||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||
| // apply mappings | ||||||||||||||||||||||||||||||||||||||||||
| // FIXME: To find out if it's a person, we extract all mapped properties a second time and throw them away. | ||||||||||||||||||||||||||||||||||||||||||
| // Find a better solution. For example: Make sure that this extractor runs after the | ||||||||||||||||||||||||||||||||||||||||||
| // MappingExtractor. In the MappingExtractor, set the page type as an attriute. | ||||||||||||||||||||||||||||||||||||||||||
| // Even better: in the first extraction pass, extract all types. Use them in the second pass. | ||||||||||||||||||||||||||||||||||||||||||
| val mappingGraph = super.extract(node, subjectUri) | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| // if this page is mapped onto Person | ||||||||||||||||||||||||||||||||||||||||||
| if (mappingGraph.exists(q => q.predicate == typeProperty && q.value == personUri)) | ||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||
| // get the page text | ||||||||||||||||||||||||||||||||||||||||||
| val wikiText: String = node.toWikiText | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| // count gender pronouns | ||||||||||||||||||||||||||||||||||||||||||
| var genderCounts: Map[String, Int] = Map() | ||||||||||||||||||||||||||||||||||||||||||
| for ((pronoun, gender) <- pronounMap) | ||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||
| val regex = new Regex("\\W" + pronoun + "\\W") | ||||||||||||||||||||||||||||||||||||||||||
| val count = regex.findAllIn(wikiText).size | ||||||||||||||||||||||||||||||||||||||||||
| val oldCount = genderCounts.getOrElse(gender, 0) | ||||||||||||||||||||||||||||||||||||||||||
| genderCounts = genderCounts.updated(gender, oldCount + count) | ||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| // get maximum gender | ||||||||||||||||||||||||||||||||||||||||||
| var maxGender = "" | ||||||||||||||||||||||||||||||||||||||||||
| var maxCount = 0 | ||||||||||||||||||||||||||||||||||||||||||
| var secondCount = 0.0 | ||||||||||||||||||||||||||||||||||||||||||
| for ((gender, count) <- genderCounts) | ||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||
| if (count > maxCount) | ||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||
| secondCount = maxCount.toDouble | ||||||||||||||||||||||||||||||||||||||||||
| maxCount = count | ||||||||||||||||||||||||||||||||||||||||||
| maxGender = gender | ||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| // output triple for maximum gender | ||||||||||||||||||||||||||||||||||||||||||
| if (maxGender != "" && maxCount > GenderExtractorConfig.minCount && maxCount/secondCount > GenderExtractorConfig.minDifference) | ||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||
| return Seq(new Quad(context.language, DBpediaDatasets.Genders, subjectUri, genderProperty, maxGender, node.sourceIri, new Datatype("rdf:langString"))) | ||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||
| class GenderExtractor( | ||||||||||||||||||||||||||||||||||||||||||
| context: { | ||||||||||||||||||||||||||||||||||||||||||
| def mappings: Mappings | ||||||||||||||||||||||||||||||||||||||||||
| def ontology: Ontology | ||||||||||||||||||||||||||||||||||||||||||
| def language: Language | ||||||||||||||||||||||||||||||||||||||||||
| def redirects: Redirects | ||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||
| ) extends MappingExtractor(context) { | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| /** Language code (en, de, fr, etc.) */ | ||||||||||||||||||||||||||||||||||||||||||
| private val language: String = | ||||||||||||||||||||||||||||||||||||||||||
| context.language.wikiCode | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| /** Pronoun → gender map (from config) */ | ||||||||||||||||||||||||||||||||||||||||||
| private val pronounMap: Map[String, String] = | ||||||||||||||||||||||||||||||||||||||||||
| GenderExtractorConfig.pronounsMap(language) | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| /** Ontology-based properties & classes */ | ||||||||||||||||||||||||||||||||||||||||||
| private val genderProperty = | ||||||||||||||||||||||||||||||||||||||||||
| context.ontology.properties("foaf:gender") | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| private val typeProperty = | ||||||||||||||||||||||||||||||||||||||||||
| context.ontology.properties("rdf:type") | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| private val personClass = | ||||||||||||||||||||||||||||||||||||||||||
| context.ontology.classes("Person") | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| override val datasets: Set[String] = | ||||||||||||||||||||||||||||||||||||||||||
| Set(DBpediaDatasets.Genders) | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| override def extract(node: PageNode, subjectUri: String): Seq[Quad] = { | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| /** First pass: extract mappings to detect rdf:type */ | ||||||||||||||||||||||||||||||||||||||||||
| val mappingGraph: Seq[Quad] = | ||||||||||||||||||||||||||||||||||||||||||
| super.extract(node, subjectUri) | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| /** Check if entity is a dbo:Person */ | ||||||||||||||||||||||||||||||||||||||||||
| val isPerson: Boolean = | ||||||||||||||||||||||||||||||||||||||||||
| mappingGraph.exists(q => | ||||||||||||||||||||||||||||||||||||||||||
| q.predicate.uri == typeProperty.uri && | ||||||||||||||||||||||||||||||||||||||||||
| q.value.uri == personClass.uri | ||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+54
to
+58
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Compilation error: accessing The 🔧 Proposed fix val isPerson: Boolean =
mappingGraph.exists(q =>
- q.predicate.uri == typeProperty.uri &&
- q.value.uri == personClass.uri
+ q.predicate == typeProperty.uri &&
+ q.value == personClass.uri
)🧰 Tools🪛 GitHub Actions: DIEF Long-Running Extraction Tests[error] 56-56: GenderExtractor.scala: 'uri' is not a member of String. Accessing 'uri' on a String value is invalid. [error] 57-57: GenderExtractor.scala: 'uri' is not a member of String. Accessing 'uri' on a String value is invalid. 🪛 GitHub Actions: DIEF Server Component Web API Extraction Tests[error] 56-56: GenderExtractor.scala: 'uri' is not a member of String (attempting to access 'uri' on a String in q.predicate.uri) [error] 57-57: GenderExtractor.scala: 'uri' is not a member of String (attempting to access 'uri' on a String in q.value.uri) 🪛 GitHub Actions: Snapshot Deploy[error] 56-57: Ошибка: 'uri' is not a member of String. Accessing property 'uri' on a String is invalid in this context. [error] 57-57: Ошибка: 'uri' is not a member of String. Accessing property 'uri' on a String is invalid in this context. 🪛 GitHub Actions: Update Minidump document[error] 56-57: GenderExtractor.scala: 'uri' is not a member of String. Expected a property on an object with a 'uri' field. [error] 56-57: GenderExtractor.scala: 'q.predicate.uri' and 'personClass.uri' refer to 'uri' on Strings, causing compile-time errors. 🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| if (!isPerson) return Seq.empty | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| /** Get full wiki text */ | ||||||||||||||||||||||||||||||||||||||||||
| val wikiText: String = | ||||||||||||||||||||||||||||||||||||||||||
| node.toWikiText | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| /** Count pronouns by gender */ | ||||||||||||||||||||||||||||||||||||||||||
| var genderCounts: Map[String, Int] = | ||||||||||||||||||||||||||||||||||||||||||
| Map.empty.withDefaultValue(0) | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| for ((pronoun, gender) <- pronounMap) { | ||||||||||||||||||||||||||||||||||||||||||
| val regex = | ||||||||||||||||||||||||||||||||||||||||||
| new Regex("\\W" + Regex.quote(pronoun) + "\\W") | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| val count = | ||||||||||||||||||||||||||||||||||||||||||
| regex.findAllIn(wikiText).size | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| genderCounts = | ||||||||||||||||||||||||||||||||||||||||||
| genderCounts.updated(gender, genderCounts(gender) + count) | ||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+71
to
80
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Regex pattern may miss pronouns at text boundaries. The pattern 💡 Suggested fix using word boundaries val regex =
- new Regex("\\W" + Regex.quote(pronoun) + "\\W")
+ new Regex("(?i)\\b" + Regex.quote(pronoun) + "\\b")This also adds case-insensitivity ( 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| Seq.empty | ||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||
| if (genderCounts.isEmpty) return Seq.empty | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| /** Find dominant gender */ | ||||||||||||||||||||||||||||||||||||||||||
| val sorted = | ||||||||||||||||||||||||||||||||||||||||||
| genderCounts.toSeq.sortBy(-_._2) | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| val (maxGender, maxCount) = | ||||||||||||||||||||||||||||||||||||||||||
| sorted.head | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| val secondCount: Double = | ||||||||||||||||||||||||||||||||||||||||||
| if (sorted.size > 1) sorted(1)._2.toDouble else 0.0 | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| /** Avoid division-by-zero */ | ||||||||||||||||||||||||||||||||||||||||||
| val differenceOk: Boolean = | ||||||||||||||||||||||||||||||||||||||||||
| secondCount == 0.0 || | ||||||||||||||||||||||||||||||||||||||||||
| (maxCount.toDouble / secondCount) > | ||||||||||||||||||||||||||||||||||||||||||
| GenderExtractorConfig.minDifference | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| /** Threshold checks */ | ||||||||||||||||||||||||||||||||||||||||||
| if ( | ||||||||||||||||||||||||||||||||||||||||||
| maxGender.nonEmpty && | ||||||||||||||||||||||||||||||||||||||||||
| maxCount > GenderExtractorConfig.minCount && | ||||||||||||||||||||||||||||||||||||||||||
| differenceOk | ||||||||||||||||||||||||||||||||||||||||||
| ) { | ||||||||||||||||||||||||||||||||||||||||||
| Seq( | ||||||||||||||||||||||||||||||||||||||||||
| new Quad( | ||||||||||||||||||||||||||||||||||||||||||
| context.language, | ||||||||||||||||||||||||||||||||||||||||||
| DBpediaDatasets.Genders, | ||||||||||||||||||||||||||||||||||||||||||
| subjectUri, | ||||||||||||||||||||||||||||||||||||||||||
| genderProperty, | ||||||||||||||||||||||||||||||||||||||||||
| maxGender, | ||||||||||||||||||||||||||||||||||||||||||
| node.sourceIri, | ||||||||||||||||||||||||||||||||||||||||||
| new Datatype("rdf:langString") | ||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: # First, let's look at the GenderExtractor.scala file structure around line 113
fd "GenderExtractor.scala" --type fRepository: dbpedia/extraction-framework Length of output: 145 🏁 Script executed: # Check how Datatype is used across the codebase
rg -n "new Datatype\(" --type scala | head -30Repository: dbpedia/extraction-framework Length of output: 4719 🏁 Script executed: # Check for ontology-based datatype usage patterns
rg -n "ontology\.datatypes" --type scala | head -30Repository: dbpedia/extraction-framework Length of output: 4547 🏁 Script executed: # Also check for Datatype instantiation in class fields
rg -n "private.*Datatype|val.*Datatype.*=" --type scala | head -30Repository: dbpedia/extraction-framework Length of output: 8102 🏁 Script executed: cat -n core/src/main/scala/org/dbpedia/extraction/mappings/GenderExtractor.scala | sed -n '100,125p'Repository: dbpedia/extraction-framework Length of output: 620 🏁 Script executed: # Let's also check if GenderExtractor has access to context.ontology
rg -n "class GenderExtractor|ontology\." core/src/main/scala/org/dbpedia/extraction/mappings/GenderExtractor.scala -A 5 -B 5Repository: dbpedia/extraction-framework Length of output: 1402 🏁 Script executed: # Check PersondataExtractor more closely since it uses class fields with Datatype
head -50 core/src/main/scala/org/dbpedia/extraction/mappings/PersondataExtractor.scalaRepository: dbpedia/extraction-framework Length of output: 2613 🏁 Script executed: # Check CategoryLabelExtractor which also uses Datatype in a field
head -30 core/src/main/scala/org/dbpedia/extraction/mappings/CategoryLabelExtractor.scalaRepository: dbpedia/extraction-framework Length of output: 1208 🏁 Script executed: # Check OntologyDatatypes.scala to see how datatypes are loaded
head -60 core/src/main/scala/org/dbpedia/extraction/ontology/OntologyDatatypes.scalaRepository: dbpedia/extraction-framework Length of output: 3085 🏁 Script executed: # Check if rdf:langString is available in ontology.datatypes
rg -n "rdf:langString" core/src/main/scala/org/dbpedia/extraction/ontology/OntologyDatatypes.scalaRepository: dbpedia/extraction-framework Length of output: 161 Cache the The ♻️ Suggested improvementAdd as a class field: private val langStringDatatype = new Datatype("rdf:langString")Then use 🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||
| } else { | ||||||||||||||||||||||||||||||||||||||||||
| Seq.empty | ||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
Repository: dbpedia/extraction-framework
Length of output: 156
🏁 Script executed:
Repository: dbpedia/extraction-framework
Length of output: 6912
🏁 Script executed:
Repository: dbpedia/extraction-framework
Length of output: 3230
🏁 Script executed:
Repository: dbpedia/extraction-framework
Length of output: 1928
🏁 Script executed:
Repository: dbpedia/extraction-framework
Length of output: 122
🏁 Script executed:
Repository: dbpedia/extraction-framework
Length of output: 3915
🏁 Script executed:
Repository: dbpedia/extraction-framework
Length of output: 50384
🏁 Script executed:
Repository: dbpedia/extraction-framework
Length of output: 7614
🏁 Script executed:
Repository: dbpedia/extraction-framework
Length of output: 6702
🏁 Script executed:
Repository: dbpedia/extraction-framework
Length of output: 456
🏁 Script executed:
Repository: dbpedia/extraction-framework
Length of output: 3942
🏁 Script executed:
Repository: dbpedia/extraction-framework
Length of output: 817
🏁 Script executed:
Repository: dbpedia/extraction-framework
Length of output: 175
🏁 Script executed:
Repository: dbpedia/extraction-framework
Length of output: 1394
Remove the incorrect type annotation
Set[String].The
datasetsoverride declaresSet[String]but the parentExtractortrait expectsSet[Dataset]. SinceDBpediaDatasets.Gendersis aDatasetobject, remove the explicit type annotation and let Scala infer the correct type:🔧 Correct fix
Or keep it concise on one line:
📝 Committable suggestion
🧰 Tools
🪛 GitHub Actions: DIEF Long-Running Extraction Tests
[error] 45-45: GenderExtractor.scala: type mismatch: found org.dbpedia.extraction.config.provenance.Dataset, required: String. Set(DBpediaDatasets.Genders) is used where a String is expected.
🪛 GitHub Actions: DIEF Server Component Web API Extraction Tests
[error] 45-45: GenderExtractor.scala: type mismatch; found org.dbpedia.extraction.config.provenance.Dataset, required: String
🪛 GitHub Actions: Snapshot Deploy
[error] 45-45: Type mismatch: found org.dbpedia.extraction.config.provenance.Dataset; required: String. Use a string identifier for the dataset.
🪛 GitHub Actions: Update Minidump document
[error] 45-45: Type mismatch: found org.dbpedia.extraction.config.provenance.Dataset; required: String. Set(DBpediaDatasets.Genders) is providing a Dataset instead of a String.
🤖 Prompt for AI Agents