[
https://issues.apache.org/jira/browse/OPENNLP-1846?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Martin Wiesner resolved OPENNLP-1846.
-------------------------------------
Resolution: Fixed
> Fix NameFinderDL only worked with Person, expand to all types
> -------------------------------------------------------------
>
> Key: OPENNLP-1846
> URL: https://issues.apache.org/jira/browse/OPENNLP-1846
> Project: OpenNLP
> Issue Type: Improvement
> Components: dl
> Affects Versions: 2.5.9, 3.0.0-M3
> Reporter: Kristian Rickert
> Assignee: Kristian Rickert
> Priority: Major
> Fix For: 3.0.0-M4
>
> Time Spent: 5h
> Remaining Estimate: 0h
>
> h2. Summary
> {{NameFinderDL}} is hardcoded to recognize only the {{person}} entity type.
> Although the caller supplies a full {{ids2Labels}} map, {{find()}} only acts
> on the {{B-PER}}/{{I-PER}} labels and ignores every other
> {{B-<TYPE>}}/{{I-<TYPE>}} the model emits (e.g. {{ORG}}, {{LOC}}, {{MISC}}).
> It should decode all entity types the model was trained for.
> A second, related defect: the resulting {{Span}} is constructed with the
> matched *text* in the type slot ({{new Span(start, end, spanText,
> confidence)}}), so {{Span.getType()}} returns the entity text rather than its
> label.
> h2. Current behavior
> {code:java}
> public static final String I_PER = "I-PER";
> public static final String B_PER = "B-PER";
> ...
> final String label = ids2Labels.get(maxIndex);
> if (B_PER.equals(label)) { // only person is decoded
> final SpanEnd spanEnd = findSpanEnd(...); // looks for I-PER only
> ...
> spans.add(new Span(characterStart, characterEnd, spanText, confidence)); //
> type = matched text
> }
> {code}
> So a 4-class NER model such as {{dslim/bert-base-NER}} (PER/ORG/LOC/MISC)
> returns only the person spans, each labelled with the covered text instead of
> {{"PER"}}.
> h2. Proposed change
> Decode the BIO sequence generically:
> * Begin a span on any label starting with {{B-}}; the entity type is the
> label minus the {{B-}} prefix (e.g. {{B-ORG}} -> {{ORG}}).
> * Extend the span while the following labels are {{I-<same type>}}
> (generalize {{findSpanEnd}} from {{I-PER}} to {{I-<type>}}).
> * Set {{Span.getType()}} to the decoded entity type (e.g. {{"PER"}},
> {{"ORG"}}), not the matched text.
> The {{B_PER}}/{{I_PER}} constants become unnecessary for the decode logic
> (may be retained as documented examples). This makes {{ids2Labels}} fully
> drive recognition for any BIO-tagged token-classification model.
> h2. Backward compatibility
> OpenNLP 3.0.0 is pre-release, so the behavioral change is acceptable. Notes:
> * Models that emit only person labels keep working, now correctly labelled
> {{"PER"}}.
> * {{Span.getType()}} changes from the matched text to the entity label — this
> is the intended/correct value and fixes the defect above.
> * Multi-type models now return additional spans (ORG/LOC/MISC) that were
> previously dropped. {{NameFinderDLEval}} currently pins person-only
> expectations (e.g. exactly one span for "George Washington was president of
> the United States."); those assertions must be updated to reflect the
> additional entities and the corrected span types.
> h2. Testing
> * Update {{NameFinderDLEval}} to assert the full multi-type output (PER plus
> ORG/LOC/MISC as applicable) and that {{Span.getType()}} holds the entity
> label.
> * Add coverage for multi-token spans of non-person types and for adjacent
> spans of different types.
> h2. Downstream
> This unblocks multi-type ONNX NER in the opennlp-grpc server: its DL name
> finder wrapper already routes by entity type and only needs {{NameFinderDL}}
> to emit them.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)