Tie koodariksi

Programmeringens grunder

Språk:

Kapitel 11: Språkidentifierare

Datorns sätt att dra slutsatser är ibland väldigt annorlunda än människors sätt. Detta kommer vi att märka i det följande. Vårt mål är att göra ett program som gissar om det har fått text på finska eller engelska.

Det finns flera möjligheter att göra ett sådant program. Ett sätt vore att koppla ett lexikon till programmet och avgöra språket med hjälp av det. Om man till exempel ger programmet texten ”hello world”, kan det avgöra med hjälp av lexikonet att orden ”hello” och ”world” är på engelska och sålunda är texten på engelska. Detta sätt skulle dock vara förknippat med vissa svårigheter: vi bör hitta ett lexikon någonstans, lyckas koppla det till programmet och hoppas att användaren matar in text där orden finns med i lexikonet. Inte ens ett bra lexikon innehållet alla ord i språket. Till exempel är ordet ”hattivattisaari” tydlig finska, men förekommer säkert inte i ett lexikon.

Nu gör vi programmet på ett helt annat sätt, utan lexikon, men så att det kan avgöra språket för vilken text som helst.

Det visar sig att en nyttig egenskap för att identifiera språk är textens andel vokaler. Denna räknas ut med formeln v/(v+k), där v är antalet vokaler och k är antalet konsonanter. Till exempel är andelen vokaler i ordet "opera" 3/5 = 0.60. Andelen vokaler uttrycker hur mycket vokaler texten innehåller. Till exempel betyder vokalandelen 0.60 att 60 procent av bokstäverna i texten är vokaler.

Vi kan gissa textens språk med hjälp av vokalandelen, eftersom olika språk statistiskt har olika vokalandel. Genom att undersöka andelen vokaler i omfattande textmaterial har man kunnat ta reda på att vokalandelen för finska är 0.48 och för engelska 0.40. Med andra ord är vokaler vanligare i finska än i engelska. Om vokalandelen är närmare 0.48 kan programmet med hjälp av denna information gissa att texten är på finska och om vokalandelen är närmare 0.40 kan det gissa att texten är på engelska.

Följande kod visar hur vi kan genomföra språkidentifieraren i praktiken. Den text som ska undersökas ges i början av programmet i variabeln text.

text = "mieleni minun tekevi, aivoni ajattelevi"
v = 0
k = 0
for x in text:
    if x in "aeiouyåäö":
        v += 1
    if x in "bcdfghjklmnpqrstvwxz":
        k += 1
andel = v/(v+k)
if andel >= 0.44:
    print("finska")
else:
    print("engelska")

Här går variabeln x igenom tecknen i texten. Om x är en vokal ökar värdet för variabeln v och om x är en konsonant ökar värdet för variabeln k. Till slut räknar programmet ut vokalandelen och skriver ut en gissning om textens språk.

Till exempel är vokalandelen i texten "mieleni minun tekevi, aivoni ajattelevi" 0.52941, och därför gissar programmet att det är fråga om finska, vilket är korrekt.

På motsvarande sätt är vokalandelen i texten "a monkey has three bananas and a harpsichord" 0.40541, så programmet gissar att texten är på engelska, vilket också är korrekt.

Ju mer text programmet får, desto bättre fungerar det i praktiken. Om programmet får ett enda ord kan det ta fel, men om texten innehåller hundra ord identifierar programmet texten helt säkert i praktiken.


Du kan testa med att räkna ut vokalandelen och identifiera språket genom att skriva in text i följande fält:

Vokaaler:
Konsonanter:
Andel vokaler:
Språk:

Ofta går det bra att avgöra språket utifrån vokalandelen, men kan man lura datorn på något sätt?

Hittar du på någon mening på finska som datorn kommer att tro är engelska? Eller hittar du på någon mening på engelska som datorn kommer att tro är finska?