13375k1133z Skrevet 24. september 2013 Del Skrevet 24. september 2013 Har oppgaven: bruk Macbeth som eksempel for a lage en tabell over frekvenser av ulike bokstaver i engelsk tekst. Bruk x^2 tankegangen til å avgjøre hvilket av stykkene x1 og x2 som ligner mest på x3 (som har likest bokstavfordeling). b) Regn ogsa ut x^2 for x9 Sliter litt med å gjøre det oppgaven sier. Til info: x^2 tankegangen = metoden/funksjonen: computeChiSquare. import java.io.BufferedReader; import java.io.FileReader; public class Oppg1 { public static double[] computeFrequencyOfFile(String fileName){ double[] frequencyTable = new double[26]; int numberOfLetters = 0; try{ FileReader tekstFilLeser = new FileReader(fileName); BufferedReader tekstLeser = new BufferedReader(tekstFilLeser); int c = tekstLeser.read(); while (c != -1){ // c = -1 svarer til end-of-file if (c >= 'a' && c <= 'z'){ // hvis c er en liten bokstav frequencyTable[c-'a']++; } if (c >= 'A' && c <= 'Z'){ // hvis c er en stor bokstav frequencyTable[c-'A']++; } c = tekstLeser.read(); } tekstLeser.close(); for (int i = 0; i< 26;i++){ //System.out.printf("Antall " + (char)('a'+i) + " er %d\n", antallBokstaver[i]); numberOfLetters += frequencyTable[i]; } } catch (Exception e){//Catch exception if any System.err.println("Error: " + e.getMessage()); } for (int i = 0; i < frequencyTable.length;i++){ frequencyTable[i] /= numberOfLetters; } return frequencyTable; } public static double computeChiSquare(double[] observedFrequencies, double[] referenceFrequencies){ // Tabellene skal ha samme lengde. double toReturn = 0; for (int i = 0; i < observedFrequencies.length; i++){ toReturn += (observedFrequencies[i] - referenceFrequencies[i])*(observedFrequencies[i] - referenceFrequencies[i])/referenceFrequencies[i]; } return toReturn; } public static double[] computeFrequencyOfString(String text){ // 26 pga 26 bokstaver i det engelske alfabetet double[] frequencyTable = new double[26]; char[] textAsArray = text.toCharArray(); int numberOfLetters = 0; for (char c : textAsArray){ if (c>='a' && c <='z'){ //lowercase frequencyTable[c-'a']++; numberOfLetters++; } if (c>='A' && c <='Z'){ // uppercase frequencyTable[c-'A']++; numberOfLetters++; } } for (int i = 0; i < frequencyTable.length;i++){ frequencyTable[i] /= numberOfLetters; } return frequencyTable; } public static void main(String[] args){ double[] test = computeFrequencyOfFile("G:\\minfil"); } } } Jeg klarer rett å slett ikke å implementere main metoden for å bruke metodene for å regne ut x2, sammenligne etc.. Lenke til kommentar
jonny Skrevet 24. september 2013 Del Skrevet 24. september 2013 Her er et forslag: public static void main(String[] args){ double[][] freqTables = new double[args.length][]; for (int i = 0; i < args.length; i++) { freqTables[i] = computeFrequencyOfFile(args[i]); } int minChiSquareIndex = -1; double[] chiSquares = new double[freqTables.length-1]; for (int i = 0; i < chiSquares.length; i++) { chiSquares[i] = computeChiSquare( freqTables[i], freqTables[chiSquares.length]); System.out.println(args[i] + "\n Difference: " + chiSquares[i]); if (minChiSquareIndex == -1 || chiSquares[i] < chiSquares[minChiSquareIndex]) { minChiSquareIndex = i; } } System.out.println(args[minChiSquareIndex] + " is most equal to " + args[chiSquares.length]); } Ikke noe feilsjekking der, krever at minst 2 filnavn (som eksisterer) oppgis som argumenter når programmet startes. Det siste argumentet (filnavnet) blir brukt som referanse. Du bør nok også modifisere computeChiSquare-metoden slik at den takler bedre at referanse-tabellen har 0 forekomster av enkelte tegn. Slik metoden er nå vil den da returnere NaN. 1 Lenke til kommentar
13375k1133z Skrevet 24. september 2013 Forfatter Del Skrevet 24. september 2013 (endret) Takk for fantastisk godt svar. Får feilmelding når jeg starter programmet: ' Exception in thread "main" java.lang.NegativeArraySizeException at Oppg1.main(Oppg1.java:75) linje 75 = double[] chiSquares = new double[freqTables.length-1]; . Har jeg oppgitt filene som argument feil? MOBILEDIT: Har ikke PCen foran meg, kom til å tenke på at det kunne være greit å skrive følgende også: . I main metoden skrev jeg noe àla: metode("sti\\påfil"); metode("sti\\påfil2"); Endret 24. september 2013 av 13375k1133z Lenke til kommentar
jonny Skrevet 24. september 2013 Del Skrevet 24. september 2013 Argumentene må gis til programmet når du starter det, slik: java <navn-på-klasse> filnavn1 filnavn2 referansefil Hvis klassen din heter TextAnalyzer, og filene heter x1.txt, x2.txt og x3.txt starter du programmet slik: java TextAnalyzer x1.txt x2.txt x3.txt Hvis du bruker Eclipse, kan du istedenfor oppgi argumentene ved å bruke menyen Run -> Run Configurations... og deretter velge "Arguments"-tab'en og skrive filnavnene i den øverste boksen ("Program arguments") der. 1 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå