From 11888efa8e54797926a474fea4ad3801aadea91e Mon Sep 17 00:00:00 2001 From: Kristoffer Andersson Date: Wed, 5 Jun 2024 11:03:54 +0200 Subject: [PATCH] fix: handle long texts Fixes #10 --- examples/issue-10/config.yaml | 19 ++++++ examples/issue-10/source/fp-1905-v.xml | 1 + examples/texts/fp-1905-v.xml | 64 +++++++++++++++++++ .../annotations.py | 1 + .../sentiment_analyzer.py | 39 ++++++++++- .../test_sentiment_analyzer.ambr | 4 ++ .../tests/test_sentiment_analyzer.py | 29 +++++++++ 7 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 examples/issue-10/config.yaml create mode 120000 examples/issue-10/source/fp-1905-v.xml create mode 100644 examples/texts/fp-1905-v.xml create mode 100644 sparv-sbx-sentence-sentiment-kb-sent/tests/__snapshots__/test_sentiment_analyzer.ambr diff --git a/examples/issue-10/config.yaml b/examples/issue-10/config.yaml new file mode 100644 index 0000000..b2869d0 --- /dev/null +++ b/examples/issue-10/config.yaml @@ -0,0 +1,19 @@ +metadata: + id: example-sparv-sbx-sentence-kb-sent-issue-10 + language: swe + +# import: +# importer: text_import:parse + +sbx_sentence_sentiment_kb_sent: + num_decimals: 3 + +export: + annotations: + - + # - + - :stanza.pos + - :sbx_sentence_sentiment_kb_sent.sentence-sentiment--kb-sent + +sparv: + compression: none diff --git a/examples/issue-10/source/fp-1905-v.xml b/examples/issue-10/source/fp-1905-v.xml new file mode 120000 index 0000000..b6f1f77 --- /dev/null +++ b/examples/issue-10/source/fp-1905-v.xml @@ -0,0 +1 @@ +../../texts/fp-1905-v.xml \ No newline at end of file diff --git a/examples/texts/fp-1905-v.xml b/examples/texts/fp-1905-v.xml new file mode 100644 index 0000000..a99b783 --- /dev/null +++ b/examples/texts/fp-1905-v.xml @@ -0,0 +1,64 @@ + +FRISINNADE LANDSFÖRENINGENS VALPROGRAM 1905. + +De val till Andra kammaren, som i höst skola äga rum, kunna blifva af afgörande betydelse för den frisinnade, framstegsvänliga politiken i vårt land. + +Klarare än någonsin har det visat sig, att tillvaron af en stark, reformvänlig majoritet i Andra kammaren utgör det oeftergifliga villkoret för ett verkligt framstegsarbete och det enda säkra värnet för framtiden mot reaktionära öfverraskningar och vådor. + +Äfven denna gång, liksom för tre år sedan, står striden i främsta rummet kring + +rösträttsfrågan. + +I den frågan skola valmännen gifva svar på tvenne spörsmål. Det ena: skall det proportionella valsättet vid val till Andra kammaren en gång för alla afskrifvas från dagordningen? Det andra: skall det blifva möjligt att under instundande period föra fram till seger ett positivt rösträttsförslag? + +För att valen skola gifva ett jakande och otvetydigt svar på det förra spörsmålet erfordras ovillkorligen, att de frisinnade valmännen af kandidaterna kräfva bestämdt besked, huruvida de äro fast beslutna att motsätta sig det proportionella valsättet eller icke. Det är så mycket nödvändigare, som de konservativa partiernas valprogram, utan att tillkännagifva uttrycklig anslutning till proportionella val, allenast uttala sig i obestämda antydningar, som kunna tolkas på mer än ett sätt. Må alltså ingen, som sväfvar på målet beträffande dessa proportionella val, godtagas som kandidat på den frisinnade sidan! Till detta valsätt måste en hvar, som skall kunna betecknas såsom de frisinnades man och förtjäna deras tillit, säga ett otvetydigt nej. + +För att det skall blifva möjligt att under nästa period komma till ett positivt resultat i rösträttsfrågan kräfves jämväl, att valmännen till Andra kammaren sända representanter, hvilka äro besjälade af verkligt reformintresse och besitta både vilja och förmåga att nedlägga kraftigt arbete på den stora frågans lösning i ärligt demokratisk riktning. + +Beträffande själfva sättet för lösningen har Frisinnade landsföreningen redan förut tillkännagifvit sin principiella ståndpunkt: den allmänna, lika och direkta rösträtten. + +Med afseende å utskyldsstrecket har föreningen sökt uppvisa de inkonsekvenser, ojämnheter och orättvisor, som därmed äro förbundna. Föreningen vidhåller denna sin uppfattning och skulle lifligt önska, att densamma kunde vinna allmän anslutning. Men med de erfarenheter som nu vunnits, om, huru bestämdt utskyldsstrecket fasthålles äfven af ärliga och för framstegsarbetet omistliga frisinnade män, skulle Frisinnade landföreningen göra reformarbetet en dålig tjänst genom att tillråda valmännen att förkasta hvarje kandidat, som är anhängare af utskyldsstrecket Och framför allt: rösträttsfrågan kunde därigenom, sådan ställningen nu är, långt ifrån att främjas, ohjälpligt skadas. Ty ett ovillkorlig kraf på anslutning till allmän rösträtt utan utskyldsstreck kunde på mer än ett håll blifva detsamma som att spela segern i händerna på motståndarne, d.v.s. på dem, som fordra ej blott utskyldsstrecket utan där jämte de proportionella valen. + +I fråga om valkretsindelningen bör framhållas, att, huru densamma än må ordnas, hvarje förslag om köpingars och municipalsamhällens utsöndrandande från landtvalkretsarne bör bestämdt afvisas såsom ett steg i reaktionär riktning. + +Tvenne andra spörsmål kunna äfven i samband med rösträttsfrågan förtjäna öfvervägande: dels det huruvida ej ett första val, där ingen af kandidaterna erhållit absolut majoritet (= mer än hälften af de afgifna rösterna), borde föranleda ett nytt val för att gifva valmännen tillfälle att söka uppnå större enighet, och dels det huruvida ej bostadsbandet i dess nuvarande stränga form orsakar vissa olägenheter, som borde afhjälpas. Intetdera af dessa spörsmål står dock i det omedelbara förhållande till själfva valrättens utsträckning, att rösträttsfrågans lösning däraf bör uppehållas. + +Hufvudfrågan vid de stundande valen är och förblir: proportionella val eller majoritetsval? Och hufvuduppgiften för de frisinnade valmännen är och förblir: att till riksdagen sända män, som äro fast beslutna att under nästa, period genomdrifva en rösträttsform, grundad på den allmänna rösträttens princip utan förening med proportionellt valsätt. + +Det är en oafvislig plikt för Sveriges riksdag att icke längre töfva med den i så lång tid väntade rösträttsreformen. Vid det nya härordningsförslaget knötos i detta afseende löften och försäkringar, som rättvislingen måste infrias. Det är ju också oförtydbart, att hvarje uppskof med denna för folkets breda lager så djupt betydelsefulla sak alstrar ett starkt växande missnöje och bidrager till att framkalla oro och förvecklingar i samhället. + +Den treårsperiod, som förflutit sedan Frisinnade landsföreningen förra gången vädjade till landets valmän. att sörja för en sådan sammansättning all Andra kammaren, att det demokratiska framstegsarbetet kunde med kraft främjas, betecknar ett afgjordt framsteg i jämförelse med närmast föregående riksdagsperioder. Det konservativa parti, som under lång tid behärskat kammarens politik, har rubbats i sin maktsställning. I utskotten, som förut varit till öfvervägande del besatta med detta partis män, har man kunnat insätta nya krafter, hvilka gifvit reformvännerna inflytande på ärendenas förberedande behandling, som ofta är afgörande för den slutliga. Den konstitutionella kontrollen har fått ökad styrka. Och framför allt nya förslag i reaktionär riktning ha kunnat afvärjas. Så har försöket att från de gemensamma voteringarna undandraga vissa grunder för den direkta beskattningen misslyckats. Likaså förslaget att till den under reaktionstiden införda s.k. Åkarpslagen läggs en särskild, genom sin ensidighet synnerligen orättvis strafflagstiftning för arbetareklassen i fråga om brytande af vissa arbetsaftal. Och afsättningen till arbetareförsäkringsfonden har räddats från den reduktion regeringen föreslagit. + +Det gäller nu att befästa den position, som vunnits. för att_från försvaret mot reaktionära anlopp kunna öfvergå till +ett positivt reformarbete. + +Frisinnade landsföreningen, som på allt sätt vill verka till främjande af ett sådant resultat, anser, att den förestående valkampanjen, förutom kring den politiska rösträttsfrågan såsom den gifna hufvudfrågan, bör koncentrera sig särskildt kring följande uppgifter: + +att till Andra kammaren må sändas män, hvilka - särskildt med hänsyn till statsbudgetens oerhörda stegring - vilja häfda den sunda sparsamhetens grundsatser i vår statshushållning; + +att till Andra kammaren sändas män, hvilka - sedan riksdagen antagit en progressiv inkomstskatt i förening med obligatorisk själfdeklaration - vilja verka för bevillningsförordningens omarbetande i enlighet med +dessa sålunda erkända grundsatser och därvid jämväl beakta, att taxeringsförfarandet äfven för icke deklarationsskyldige måtte blifva fullt betryggande; + +att till Andra kammaren sändas män, hvilka äro beslutna att verka för en effektiv begränsning af den kommunala röstskalan; + +att till Andra kammaren sändas män, hvilka - såsom en nödvändig konsekvens af 1901 års beslut i försvarsfrågan - vilja verka för en grundlig omarbetning af krigslagarne i tidsenlig och human riktning; + +att till Andra kammaren sändas män, hvilka äro beslutna att verka för folkskolans sunda utveckling och närmast för att äfven folkskolorna i -likhet med de allmänna läroverkan måtte erhålla sin särskilda öfverstyrelse; + +att till Andra kammaren sändas män, som vilja arbeta mot öfverhandtagande af bolagens jordvälde och för vidmakthållande och stärkande af en själfägande jordbrukande befolkning samt mot bolagsmakten i den kommunala styrelsen; + +att till Andra kammaren sändas män, hvilka fullt behjärta arbetarefrågans utomordentliga betydelse och särskildt såsom närmaste mål vilja verka för upprättande af ett statsdepartement för arbetarelagstiftning och därmed sammanhängande ärenden anordnande af opartisk medling i arbetstvister samt invaliditets- och ålderdomspensionering, och hvilka bestämdt motsätta sig all ensidig strafflagstiftning såsom botemedel mot sociala missförhållanden; + +att till Andra kammaren sändas män, hvilka i frågor sådana som näringslifvets höjande, främjande af det mindre jordbruket, utveckling af egna hensrörelsen, ny arrendelagstiftning, humanare fattigvårdslagstiftning, äfvenson tidsenlig lönereglering för de s.k. lägre statstjänarne, vilja nedlägga ett allvarligt och ihärdigt arbete för att få till stånd goda och gagnande resultat; + +samt slutligen att till Andra kammaren sändas män, hvilka på nykterhetslagstiftningens viktiga. område vilja verka för att de ekonomiska intressena ej må göra något intrång på denna lagstiftnings hufvuduppgift att befrämja nykterheten, att den kommunala själfbestämningsrätten må vinna fullständigt erkännande samt att den andel i brännvinsförsäljningsmedlen, som afsättes till understödjande af nykterhetsverksamheten, må i främsta rummet användas till det på vetenskaplig grund hvilande upplysningsarbetet i alkoholfrågan. + +Frisinnade landsföreningen förväntar att vid sitt arbete för årets val ernå samförstånd och samverkan med andra reformvänliga grupper och organisationer. + +Med rätta betonar Liberala samlingspartiet i sitt program, att valen skola utvisa, huruvida det är meningen, att Första kammaren skall diktera rösträttsfrågans lösning eller om de verkliga reformvännerna därvid skola hafva det afgörande ordet. + +Tankegången låter utvidga sig. Striden för framsteg och reformer antager i de flesta fall karaktären af en strid mot Första kammaren. Skall den svenska politiken ledas i de spår Första kammaren utstakar? Skola för hela landet betydelsefulla re till Andra kammaren. former förhalas eller, därest de genomföras, genomföras i ett stympadt skick? + +Må alla frisinnade valmän hålla samman vid årets riksdagsmannaval och genom sina valsedlar säga ett bestämdt nej till svar på de frågorna! Må de genom enig samverkan gifva det säkra underlaget för en fast, målmedveten framstegspolitik och alltså sända +en stark reformvänlig majoritet till Andra kammaren. + \ No newline at end of file diff --git a/sparv-sbx-sentence-sentiment-kb-sent/src/sbx_sentence_sentiment_kb_sent/annotations.py b/sparv-sbx-sentence-sentiment-kb-sent/src/sbx_sentence_sentiment_kb_sent/annotations.py index 8278921..85b3381 100644 --- a/sparv-sbx-sentence-sentiment-kb-sent/src/sbx_sentence_sentiment_kb_sent/annotations.py +++ b/sparv-sbx-sentence-sentiment-kb-sent/src/sbx_sentence_sentiment_kb_sent/annotations.py @@ -36,5 +36,6 @@ def annotate_sentence_sentiment( for sent_i, sent in enumerate(sentences): sent_to_tag = [token_word[token_index] for token_index in sent] out_sentence_sentiment_annotation[sent_i] = analyzer.analyze_sentence(sent_to_tag) + logger.debug("annotation[%d]=%s", sent_i, out_sentence_sentiment_annotation[sent_i]) out_sentence_sentiment.write(out_sentence_sentiment_annotation) diff --git a/sparv-sbx-sentence-sentiment-kb-sent/src/sbx_sentence_sentiment_kb_sent/sentiment_analyzer.py b/sparv-sbx-sentence-sentiment-kb-sent/src/sbx_sentence_sentiment_kb_sent/sentiment_analyzer.py index 999e10f..2171719 100644 --- a/sparv-sbx-sentence-sentiment-kb-sent/src/sbx_sentence_sentiment_kb_sent/sentiment_analyzer.py +++ b/sparv-sbx-sentence-sentiment-kb-sent/src/sbx_sentence_sentiment_kb_sent/sentiment_analyzer.py @@ -1,6 +1,7 @@ """Sentiment analyzer.""" -from typing import List, Optional +from collections import defaultdict +from typing import Dict, List, Optional, Union from sparv import api as sparv_api # type: ignore [import-untyped] from transformers import ( # type: ignore [import-untyped] @@ -19,6 +20,7 @@ MODEL_REVISION = "b0ec32dca56aa6182a6955c8f12129bbcbc7fdbd" TOK_SEP = " " +MAX_LENGTH: int = 700 class SentimentAnalyzer: @@ -77,8 +79,18 @@ def analyze_sentence(self, text: List[str]) -> Optional[str]: Returns: List[Optional[str]]: the sentence annotations. """ - sentence = TOK_SEP.join(text) - classifications = self.classifier(sentence) + total_length = sum(len(t) for t in text) + len(text) - 1 + logger.debug("analyzed text length=%d", total_length) + if total_length > MAX_LENGTH: + logger.warning( + "Long sentence (%d chars), splitting and combining results", total_length + ) + classifications = self._analyze_in_chunks(text) + else: + sentence = TOK_SEP.join(text) + logger.debug("analyzing '%s'", sentence) + classifications = self.classifier(sentence) + logger.debug("classifications = %s", classifications) collect_label_and_score = ((clss["label"], clss["score"]) for clss in classifications) score_format, score_pred = SCORE_FORMAT_AND_PREDICATE[self.num_decimals] @@ -93,6 +105,27 @@ def analyze_sentence(self, text: List[str]) -> Optional[str]: ) return f"|{classification_str}|" if classification_str else "|" + def _analyze_in_chunks(self, text: List[str]) -> List[Dict[str, Union[str, float]]]: + classifications_list = [] + start_i = 0 + curr_length = 0 + for t_i, t in enumerate(text): + if len(t) + curr_length > MAX_LENGTH: + clss = self.classifier(" ".join(text[start_i:t_i])) + classifications_list.append(clss) + start_i = t_i + else: + curr_length += len(t) + 1 + classifications_dict = defaultdict(list) + for clsss in classifications_list: + for clss in clsss: + classifications_dict[clss["label"]].append(clss["score"]) + + return [ + {"label": label, "score": sum(scores) / len(scores)} + for label, scores in classifications_dict.items() + ] + SCORE_FORMAT_AND_PREDICATE = { 1: ("{:.1f}", lambda s: s.startswith("0") and s.endswith(".0")), diff --git a/sparv-sbx-sentence-sentiment-kb-sent/tests/__snapshots__/test_sentiment_analyzer.ambr b/sparv-sbx-sentence-sentiment-kb-sent/tests/__snapshots__/test_sentiment_analyzer.ambr new file mode 100644 index 0000000..8b4d357 --- /dev/null +++ b/sparv-sbx-sentence-sentiment-kb-sent/tests/__snapshots__/test_sentiment_analyzer.ambr @@ -0,0 +1,4 @@ +# serializer version: 1 +# name: test_issue_10 + '|NEUTRAL:0.931|POSITIVE:0.700|NEGATIVE:0.743|' +# --- diff --git a/sparv-sbx-sentence-sentiment-kb-sent/tests/test_sentiment_analyzer.py b/sparv-sbx-sentence-sentiment-kb-sent/tests/test_sentiment_analyzer.py index 7ba7775..9f1c2b4 100644 --- a/sparv-sbx-sentence-sentiment-kb-sent/tests/test_sentiment_analyzer.py +++ b/sparv-sbx-sentence-sentiment-kb-sent/tests/test_sentiment_analyzer.py @@ -27,3 +27,32 @@ def remove_scores(actual: Optional[str]) -> Optional[str]: if not actual: return actual return "|".join(x.split(":")[0] for x in actual.split("|")) + + +def test_issue_10(sentiment_analyzer: SentimentAnalyzer, snapshot) -> None: # noqa: ANN001 + text = """Frisinnade landsföreningen, som på allt sätt vill verka till främjande af ett sådant resultat, anser, att den förestående valkampanjen, förutom kring den politiska rösträttsfrågan såsom den gifna hufvudfrågan, bör koncentrera sig särskildt kring följande uppgifter: + +att till Andra kammaren må sändas män, hvilka - särskildt med hänsyn till statsbudgetens oerhörda stegring - vilja häfda den sunda sparsamhetens grundsatser i vår statshushållning; + +att till Andra kammaren sändas män, hvilka - sedan riksdagen antagit en progressiv inkomstskatt i förening med obligatorisk själfdeklaration - vilja verka för bevillningsförordningens omarbetande i enlighet med +dessa sålunda erkända grundsatser och därvid jämväl beakta, att taxeringsförfarandet äfven för icke deklarationsskyldige måtte blifva fullt betryggande; + +att till Andra kammaren sändas män, hvilka äro beslutna att verka för en effektiv begränsning af den kommunala röstskalan; + +att till Andra kammaren sändas män, hvilka - såsom en nödvändig konsekvens af 1901 års beslut i försvarsfrågan - vilja verka för en grundlig omarbetning af krigslagarne i tidsenlig och human riktning; + +att till Andra kammaren sändas män, hvilka äro beslutna att verka för folkskolans sunda utveckling och närmast för att äfven folkskolorna i -likhet med de allmänna läroverkan måtte erhålla sin särskilda öfverstyrelse; + +att till Andra kammaren sändas män, som vilja arbeta mot öfverhandtagande af bolagens jordvälde och för vidmakthållande och stärkande af en själfägande jordbrukande befolkning samt mot bolagsmakten i den kommunala styrelsen; + +att till Andra kammaren sändas män, hvilka fullt behjärta arbetarefrågans utomordentliga betydelse och särskildt såsom närmaste mål vilja verka för upprättande af ett statsdepartement för arbetarelagstiftning och därmed sammanhängande ärenden anordnande af opartisk medling i arbetstvister samt invaliditets- och ålderdomspensionering, och hvilka bestämdt motsätta sig all ensidig strafflagstiftning såsom botemedel mot sociala missförhållanden; + +att till Andra kammaren sändas män, hvilka i frågor sådana som näringslifvets höjande, främjande af det mindre jordbruket, utveckling af egna hensrörelsen, ny arrendelagstiftning, humanare fattigvårdslagstiftning, äfvenson tidsenlig lönereglering för de s.k. lägre statstjänarne, vilja nedlägga ett allvarligt och ihärdigt arbete för att få till stånd goda och gagnande resultat; + +samt slutligen att till Andra kammaren sändas män, hvilka på nykterhetslagstiftningens viktiga.""".split( + " " + ) + + actual = sentiment_analyzer.analyze_sentence(text) + + assert actual == snapshot