Gå til innhold

Sammenligne tekstfiler og finne ut hvilke som ligner mest på gitt tekst


Anbefalte innlegg

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
Videoannonse
Annonse

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.

  • Liker 1
Lenke til kommentar

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 av 13375k1133z
Lenke til kommentar

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.

  • Liker 1
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...