Folkets Synonymlexikon

Download Report

Transcript Folkets Synonymlexikon

Mårten Borgström ([email protected])
Björn Hegerfors ([email protected])
Folkets Synonymlexikon
Bakgrund
Folkets synonymlexikon1 är ett projekt lett av Viggo Kann på Kungliga Tekniska Högskolan som
påbörjades 2005. Syftet med projektet var att skapa ett fritt online-synonymlexikon som styrs av
användarna (folket). Metoden som används av Folkets synonymlexikon är att besökare får se
slumpvist genererade förslag på synonympar, som de får ge en röst på skalan 0-5. Över tid blir
synonymlexikonet alltså bättre på att föreslå synonymer.
En hel del av jobbet är dock hanterat automatiskt genom språkteknologiska metoder. De
genererade förslagen är inte helt slumpvisa. Det första som gjordes, innan folk fick börja
rösta, var att man använde olika lexikon mellan svenska och andra språk för att översätta ord
fram och tillbaka. Två ord med samma översättning är kandidater till att vara synonyma med
varandra. Över 600’000 synonymparskandidater genererades den vägen. Men på grund av att
ord kan ha flera betydelser (det som är vårt mål att kartlägga), är många av dessa kandidater
dåliga.
Nästa steg, fortfarande innan folket fick möjlighet att rösta på förslag, var att automatiskt sålla
bort uppenbart dåliga kandidater med hjälp av Random Indexing. Kortfattat använder man en
stor träningsmängd med olika texter och ger varje kandidat till synonympar ett numeriskt värde
på hurpass lika orden används i texterna. Sedan tog man bara bort de paren som hade ett för
lågt värde, och kvar var drygt 200’000 kandidater.
Sedan dess har folk fått rösta på paren. Vid ett antal tillfällen har par med väldigt låga
graderingar raderats från listan, så att det inte längre dyker upp som förslag att rösta på. 2
Frågeställning
Vi vill undersöka om man kan få ut hur många betydelser ett ord har utifrån synonymparen i
folkets synonymlexikon.
1
2
http://folkets2.nada.kth.se/synlex.html
http://www.csc.kth.se/tcs/projects/infomat/rapporter/kannrosell05.pdf
Mårten Borgström ([email protected])
Björn Hegerfors ([email protected])
Datamängder
Från folkets synonymlexikon fick vi ut en lista av alla synonympar som graderats med 3
eller högre. Detta är naturligt att se som en graf där ord representerar hörn och viktade
kanter representerar synonymgraderingen. Från originaldatamängden skapade vi även en
till datamängd där vi filtrerade så att den bara innehöll all synonympar som graderats 4 eller
högre. Originaldatamängden innehöll 18 984 synonympar och 16 047 ord, 60% av orden
ligger i samma komponent och Figur 1 visar den komponenten. Den filtrerade innehöll 9 836
synonympar och 11 126 ord och kan ses i Figur 2.
Figur 1. Den största komponenten med 60% av orden från originaldatamängden.
Genererad m.h.a. Gephi3.
3
Gephi, an open source graph visualization and manipulation software, https://gephi.org/
Mårten Borgström ([email protected])
Björn Hegerfors ([email protected])
Figur 2. En graf av den filtrerade datamängden med gradering 4 eller mer.
Genererad m.h.a. Gephi.
Algoritm
För att dela upp ord i dess betydelser implementerade vi en algoritm som delar upp grannorden
till ett ord i olika grupper. Vi implementerade två olika varianter av denna algoritm som har lite
olika krav på vad som krävs för att två grannord ska tillhöra samma grupp. Den ena varianten
(djup-1) anser att två grannord tillhör samma grupp om de har en kant mellan varandra (en
grupp består alltså av ord som hänger ihop internt). Den andra varianten (djup-2) anser även att
grannord tillhör samma grupp om de har en gemensam granne utöver de ordet som man letar
betydelser för.
Mårten Borgström ([email protected])
Björn Hegerfors ([email protected])
Figur 3. Exempel på graf av ord som ger olika resultat
beroende på vilken variant av algoritmen man använder.
Om man skulle köra algoritmen på grafen i Figur 3 och letar efter betydelser till ordet A så skulle
man med djup-1 få (G), (B), (C D E) som grupper medans med djup-2 så skulle resultat bli (G),
(B C D E) då B och C båda är synonyma med ordet F.
Implementation
För att implementera grupperingen effektivt så används en variant av datastrukturen disjointset4. Våran implementation skiljer sig dock lite då vi använder ordhörnens unika id som setidentifierare istället för att skapa det med MakeSet. Då våran graf är mycket gles så lämpade
det sig att använda grannlistor för att representera grafen.
Djup-1
Pseudo-kod:
def find_meanings_d1(word_node):
neighbor_set = HashSet(word_node.neighbors)
disjoint_set = DisjointSet()
for neighbor in word_node:
for next_neighbor in neighbor.neighbors:
if next_neighbor != word_node && next_neighbor in neighbor_set:
disjoint_set.Union(neighbor, next_neighbor)
return word_node.neighbors.group_by(disjoint_set.Find)
Djup-1 algoritmen implementeras genom att man har ett HashSet som säger vilka hörn i grafen
som är direkta grannar till ordet man undersöker, denna används så att grupperna endast
4
http://en.wikipedia.org/wiki/Disjoint-set_data_structure
Mårten Borgström ([email protected])
Björn Hegerfors ([email protected])
sätts samman av kanter som går mellan synonymer till ordet man undersöker . Man skulle
kunna implementera en snabbare variant som inte tittar på orelaterad kanter om man hade en
kantmatris istället för grannlista.
Djup-2
Pseudo-kod:
def find_meanings_d2(word_node):
disjoint_set = DisjointSet()
for neighbor in word_node:
for next_neighbor in neighbor.neighbors:
if next_neighbor != word_node:
disjoint_set.Union(neighbor, next_neighbor)
return word_node.neighbors.group_by(disjoint_set.Find)
Djup-2 implementeras nästan på samma sätt som Djup-1 förutom att man inte längre behöver
undvika att göra Union på hörn som inte är grannar till ordet man undersöker. Om man tar Figur
3 som exempel så kommer B och C tillhöra samma grupp då de båda kallar Union på F och på
så sätt blir i samma grupp.
Resultat
Några exempel med djup-2
●
bar - 3 betydelser:
○ bardisk
○ kal, naken, näck, skallig
○ pub
●
hjärta - 2 betydelser:
○ blodpump
○ kärnpunkt
●
liv - 7 betydelser:
○ leva
○ leverne
○ midja
○ oljud, stoj
○ rabalder, tumult, ståhej
○ rörelse
○ väsnas
●
ringa - 6 betydelser:
Mårten Borgström ([email protected])
○
○
○
○
○
○
Björn Hegerfors ([email protected])
slå en signal, telefonera
modest, anspråkslös
få
nätt, betydelselös, futtig, bagatellartad, små, liten, skral, obetydlig, smått, svag,
späd, föga, knapphändig, otillräcklig, oansenlig
vagt
lindrig, mild, måttlig
●
ringa (filter < 4.0) - 9 betydelser:
○ otillräcklig
○ slå en signal, telefonera
○ få
○ svag, späd
○ obetydlig, smått, föga
○ vagt
○ oansenlig
○ knapphändig
○ lindrig
●
försiktig - 9 betydelser
○ aktsam
○ diskret, återhållsam
○ eftertänksam
○ lätt
○ reserverad
○ vaksam
○ varsam
○ varsamt
Analys
Resultaten ovan är ordnade efter hur bra vi tycker att de är. “bar” får en uppdelning av sina
synonymer som precis matchar den vi själva hade gjort för hand. “liv” klarar av att slå ihop vissa
av betydelserna, men “oljud”, “stoj”, “rabalder”, “tumult”, “ståhej” och kanske också “rörelse”
borde kanske ha hamnat under samma betydelse. Dessutom är “leva” och “väsnas” verb som
nog inte borde anses vara synonymer alls. “försiktig” fick i princip varje synonym som en unik
betydelse. Det är så klart långt ifrån ett optimalt resultat när man tittar på vilka ord det handlar
om.
Över lag anser vi att programmet egentligen aldrig slår ihop flera ord i en betydelse i onödan,
men tyvärr ofta låter ett ord anta lite för många olika betydelser. Och det är när vi använder
djup-2. Djup-1 gav givetvis ett ännu mer partitionerade resultat, även om skillnaden oftast inte
var stor. Vi provade också med att filtrera bort synonymer med gradering under 4.0 istället för
Mårten Borgström ([email protected])
Björn Hegerfors ([email protected])
3.0. Det gav tyvärr, likt djup-1, också generellt sett sämre resultat. Som exempel kan man titta
på “ringa” ovan. Antalet synonymer går från 24 till 13 och på samma gång går antalet betydelser
från 6 till 9. Vi hade snarare velat se antalet betydelser minska.
Samtidigt kan resultat i stil med det vi såg för “försiktig”, där antalet betydelser blir många och
antalet synonymer inte är mycket större, ge goda indikationer på ord som kan vara synonymer.
Inbördes bör klart fler av “försiktig”s synonymer också inbördes vara synonyma. Så kanske
sådana resultat kan användas för att generera dessa synonymförslag oftare för röstning.
Som mått på antalet betydelser hos ett ord, gör vårt program inte så mycket nytta. Det säger att
ordet med flest olika betydelser är “hej” med 15 betydelser, följt (ironiskt nog) av “synonym” med
14 betydelser. Men själva uppdelningen som görs kan ändå vara ganska användbar att titta på.
Förbättringar
I och med att vi tycker att grupperingarna i princip bara blev för lösa, skulle man kunna tänka sig
att söka djupare, för att se om man förstärker grupperingarna på ett bra sätt. Risken är att man
med djup-3 och högre börjar få ordkedjor där betydelsen drastiskt ändras på vägen, och har
man otur kan två synonymer till det ursprunglga ordet ha en annan gemensam synonym längre
bort även om de inte alls är synonyma med varandra.
Man skulle också kunna använda sig av synonymparens graderingar på ett mer sofistikerat sätt
i algoritmen. Kanske skulle man till exempel kunna titta på direkta synonymer utan filter, och
synonymer med djup två med ett starkare filter och sedan djup 3 med ännu starkare filter.
Men frågan är om det hjälper så mycket med tanke på att två synonymer som tillhör samma
faktiska betydelse antagligen borde vara synonyma. Om man hade ett perfekt synonymlexikon,
skulle det säkert vara den bäst förbättringen man kan tänka sig.