Skip to content

Commit

Permalink
fix: handle long texts
Browse files Browse the repository at this point in the history
Fixes #10
  • Loading branch information
kod-kristoff committed Jun 5, 2024
1 parent 8226878 commit 11888ef
Show file tree
Hide file tree
Showing 7 changed files with 154 additions and 3 deletions.
19 changes: 19 additions & 0 deletions examples/issue-10/config.yaml
Original file line number Diff line number Diff line change
@@ -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:
- <sentence>
# - <token:word>
- <token>:stanza.pos
- <sentence>:sbx_sentence_sentiment_kb_sent.sentence-sentiment--kb-sent

sparv:
compression: none
1 change: 1 addition & 0 deletions examples/issue-10/source/fp-1905-v.xml
64 changes: 64 additions & 0 deletions examples/texts/fp-1905-v.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<text id="fp-1905-v" year="1905" party_id="fp" party="Folkpartiet liberalerna" type_id="v" type="Valmanifest - Riksdagsval" källa="Hämtat från &quot;Svenska valprogram 1902-1952&quot;, sammanställda av Sven-Olov Håkansson vid Statsvetenskapliga inst. Göteborgs universitet 1959. ISBN 99-0391724-4" titel="Frisinnade landsföreningens valprogram 1905">
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.
</text>
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Original file line number Diff line number Diff line change
@@ -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]
Expand All @@ -19,6 +20,7 @@
MODEL_REVISION = "b0ec32dca56aa6182a6955c8f12129bbcbc7fdbd"

TOK_SEP = " "
MAX_LENGTH: int = 700


class SentimentAnalyzer:
Expand Down Expand Up @@ -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]

Expand All @@ -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")),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# serializer version: 1
# name: test_issue_10
'|NEUTRAL:0.931|POSITIVE:0.700|NEGATIVE:0.743|'
# ---
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 11888ef

Please sign in to comment.