2014-12-05 4 views
1

파일에 자신의 주파수 단어의 목록을 반환하지만, 그것은 단지 화면에 .txt 파일 인쇄 :.txt 파일을 읽고 내가 지금까지이

import java.io.*; 

public class ReadFile { 
    public static void main(String[] args) throws IOException { 
     String Wordlist; 
     int Frequency; 

     File file = new File("file1.txt"); 
     BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); 
     String line = null; 

     while((line = br.readLine()) != null) { 
      String [] tokens = line.split("\\s+"); 
      System.out.println(line); 
     } 
    } 
} 

사람이되도록 도와 줄 수를 단어 목록과 단어 빈도를 인쇄합니까? 단어가 이미 각 단어

if(occurrences.containsKey(word)) 
    occurrences.put(word, occurrences.get(word)+1); 
else 
    occurrences.put(word, 1); 

전체 버전 전에 읽을 수있는 경우

+0

이 txt 파일의 형식은 무엇입니까? – Ren4n

+0

그냥 제목과 file1.txt로 저장된 단락 – BronzeThunderBeard

답변

1

다음과 같이하십시오. 필자는 쉼표 나 마침표 만 파일에 나타날 수 있다고 가정합니다. 그렇지 않으면 다른 구두점 문자도 제거해야합니다. 지도의 단어가 자연 알파벳 순서로 저장되도록 TreeMap을 사용하고 있습니다.

public static TreeMap<String, Integer> generateFrequencyList() 
    throws IOException { 
    TreeMap<String, Integer> wordsFrequencyMap = new TreeMap<String, Integer>(); 
    String file = "/tmp/lorem.txt"; 
    BufferedReader br = new BufferedReader(new FileReader(file)); 
    String line; 
    while((line = br.readLine()) != null){ 
     String [] tokens = line.split("\\s+"); 
     for (String token : tokens) { 
     token = removePunctuation(token); 
     if (!wordsFrequencyMap.containsKey(token.toLowerCase())) { 
      wordsFrequencyMap.put(token.toLowerCase(), 1); 
     } else { 
      int count = wordsFrequencyMap.get(token.toLowerCase()); 
      wordsFrequencyMap.put(token.toLowerCase(), count + 1); 
     } 
     } 
    } 
    return wordsFrequencyMap; 
    } 

    private static String removePunctuation(String token) { 
    token = token.replaceAll("[^a-zA-Z]", ""); 
    return token; 
    } 

테스트 방법은 다음과 같습니다. 백분율을 얻으려면지도를 반복하고 모든 값을 추가 한 다음 백분율을 얻기 위해 두 번째 패스를 수행하여 모든 단어의 수를 계산할 수 있습니다. 그런데 이것이 더 큰 연구의 일부라면, Frequency distributions을 계산하기위한 apache commons math library를 살펴볼 수도 있습니다. Frequency 클래스를 사용하는 경우 계속해서 모든 단어를 추가 한 다음 끝에 설명적인 통계를 얻을 수 있습니다.

public static void main(String[] args) { 
    try { 
     int totalWords = 0; 
     TreeMap<String, Integer> freqMap = generateFrequencyList(); 
     for (String key : freqMap.keySet()) { 
     totalWords += freqMap.get(key); 
     } 

     System.out.println("Word\tCount\tPercentage"); 
     for (String key : freqMap.keySet()) { 
     System.out.println(key+"\t"+freqMap.get(key)+"\t"+((double)freqMap.get(key)*100.0/(double)totalWords));  
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
+0

정말 고마워요. 그것이 포함하는 punctunation은이다. :; ! 그래서 removePunctuation을 위해 내가해야 할 일은 모두 추가가 될 것입니다.replaceAll (":", "") .replaceAll (";", ""). replaceAll ("!", "")? – BronzeThunderBeard

+0

나는 백분율을 표시하고 3 열 (단어, 빈도 및 백분율)로 모두 인쇄하기로되어 있습니다. 어떻게 그 형식으로 만들 수 있습니까? – BronzeThunderBeard

0

HashMap<String, Integer> occurrences = new HashMap<String, Integer>(); 

으로 반복

for(String word: tokens) { 
    // Do stuff 
} 

그런 다음 확인 각 행의 배열을 통해 해시 MAP 만들기 :

String Wordlist; 
int Frequency; 

File file = new File("file1.txt"); 
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); 

HashMap<String, int> occurrences = new HashMap<String, int>(); 

String line = null; 

while((line = br.readLine()) != null){ 
    String [] tokens = line.split("\\s+"); 

    for(String word: tokens) { 
     if(occurences.contains(word)) 
      occurences.put(word, occurences.get(word)+1); 
     else 
      occurences.put(word, 1); 
    } 
} 

오타가있을 수 있습니다. 테스트하지는 않았지만이 작업을 수행해야합니다.

+0

"HashMap occurrences = new HashMap ();"줄에 "예기치 않은 유형이 필요합니다; 참조; 찾음 : int"가 나타납니다. – BronzeThunderBeard

+0

수정 됨. 생각없이 타이핑. HashMaps에는 유형이 매개 변수로 필요합니다.이 유형은 int가 아니라 Integer입니다. – Phiwa

+0

containsKey (단어), 포함하지 않음 (단어) – CodeMed

2

Java에 있어야합니까? 이 작업을 수행합니다

기본적으로
sed 's/[^A-Za-z]/\n/g' filename.txt | sort | uniq -c 

는 항목의 목록을 정렬, 줄 바꿈에 어떤 알파벳이 아닌 문자를 설정하고, 발생을 계산 UNIQ 수 있습니다. 빈 줄 수인 첫 번째 출력 줄을 그냥 버리십시오. 실행 속도가 빠르고 코드 작성도 빠릅니다.

외국어 [A-Za-zàèìòù]의 숫자 [A-Za-z0-9] 또는 악센트 부호가있는 문자를 포함하여 정규식을 기호에 맞게 조정할 수 있습니다.

+0

작업에 적합한 도구 :) –

+1

정규식에 어포 스트로피를 추가해야합니다. "개"를 "개"와 "s"로 취급하고 싶지는 않습니다. 어쩌면 하이픈 일 수도 있지만 회색 영역이 더 많습니다. – user1618143

+0

자바를 사용해야합니다 – BronzeThunderBeard

관련 문제