2012-05-12 3 views
-2

큰 텍스트 파일 (크기가 1G보다 큽니다)이 있으며 해당 파일 내의 특정 단어의 모양을 계산하기 위해 Java를 사용하고 싶습니다. 파일의 텍스트는 한 줄에 작성되므로 줄 단위로 확인하지 못할 수도 있습니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?Java를 사용하여 텍스트 파일의 단어 빈도를 계산하는 방법은 무엇입니까?

+0

당신이 직면 한 문제는 무엇입니까? –

+0

나는 한 줄 씩 내용을 읽으려고 BufferedReader를 사용하려고 시도했지만 그 사이에 실제로 새로운 줄 문자가 없다는 것을 깨닫고 나서 대안을 사용해야합니다. 파일 크기가 Java 프로그램의 부담이되지 않기를 바랍니다. –

+0

말은 새 줄 문자가없는 약 1GB 텍스트의 텍스트 파일입니다. 그렇다면 'readLine'이 작동하지 않습니다. 덩어리로 읽어야합니다. –

답변

2

Scanner Java 클래스를 사용하여 거대한 파일을 단어 단위로 소비하려고합니다. useDelimiter (...) 메서드를 한 번 호출하여 hasNext() 및 getNext()를 사용하여 단어를 분할하는 방법 (어쩌면 공백 문자)을 구성한 다음 파일 내용을 반복하도록 구성합니다.

카운트 자체의 경우 간단히하기 위해 HashMap을 사용할 수 있습니다.

+0

+1 ... 정확히 내가하는 방식! –

+0

사실 나는 한 단어를 세면됩니다. 이것은 일부 통계가 아닙니다. –

+2

@God_of_Thunder 아무도 숟가락으로 먹을 것입니다! –

-2

외부 도구를 사용하여 일부 텍스트 색인을 작성할 수 있습니다. 그 후이 색인에서 다른 단어를 빠르게 찾을 수 있습니다. 예. 당신은 그러한 색인을 작성하기 위해 Lucene을 얻을 수 있습니다. 그리고 나서 simpe가 그것에있는 기간의 주파수를 얻는다. 기사와 코드 예제에 대한 링크가있는 유사한 질문이 counting the word frequency in lucene index 있습니다.

+1

이 문제에 대한 훨씬 단순하고 외적인 솔루션이 있습니다. –

0

영문자 순으로 정렬하려면 먼저 단어를 정렬해야합니다. 데이터를 읽고 공간에서 단어를 분리 한 후에는 여러 가지 방법으로이 작업을 수행 할 수 있습니다. 또한 정렬 전에 특수 문자와 구두점을 제거해야합니다.

일단 정렬되면 타겟팅하는 단어가 모두 나란히 표시되어 검색 결과가 O (N) 문제가됩니다. 이 시점에서 루핑 구문을 사용하여 단어의 첫 번째 인스턴스를 찾을 때까지 각 단어를 비교하고 비교할 수 있습니다. 그 때, 당신은 다음 단어를 얻을 때까지 각 단어를 세어 루핑을 계속합니다.

그 시점에서 컬렉션에 단어의 인스턴스가 더 이상 존재하지 않으며 검색을 중지 할 수 있음을 알았습니다.

이 특정 검색 알고리즘은 O (N) 최악의 시나리오입니다. 귀하의 단어가 "사과"라면 귀하의 단어가 "얼룩말"인 경우보다 훨씬 빨리 검색이 완료 될 것입니다.

정확한 필요에 따라 선택할 수있는 알고리즘이 있습니다.

나는이 질문이 프로그래밍 연습이며 실제적인 문제는 아니라고 가정합니다. 작업에 문제가 있다면이 문제는 이미 여러 번 해결되었으며 Java 표준 라이브러리의 도구를 포함하여이 문제를 해결하는 데 도움이되는 Java 용 검색 라이브러리가 많이 있습니다.

+0

사실 내 작업에는 실제로 문제가 있습니다 (단지 운동 일 뿐이 라기를 바랍니다). 프로그램 실행 중 메모리 소비가 너무 큰지 의심 스럽기 때문에 실현 가능한 솔루션을 원합니다. 이 프로그램은 다른 프로그램의 결과를 정당화하기위한 도구 일 뿐이므로 서버가 아닌 일반 데스크탑 컴퓨터에서 실행됩니다. –

+0

컴퓨터가 느려질 수 있지만 리소스가 충분하고 JVM에 충분한 리소스가 할당되어있는 한 괜찮습니다. 그래도이 알고리즘은 C++에서 훨씬 빠를 것입니다. 각 단어를 포인터에 할당 할 수 있기 때문에 믿습니다. 실제 문자열보다 문자열에 대한 포인터를 정렬하는 것이 훨씬 빠릅니다. – jmort253

+0

아마도 C++에서 더 잘 작동하지만 효율성은 여기에별로 신경 쓰지 않습니다. 이 프로그램에서 내가 원하는 건 그 파일의 레이아웃이 원하는 것인지 확인하는 것뿐입니다. 그래서 그것은 단지 2 번만 실행될 것이고 나는 그것을 더 이상 사용하지 않습니다. –

1

Trie 데이터 구조의 약간의 변형을 사용할 수 있습니다. 이 DS는 단어 사전을 만드는 데 사용됩니다. 예를 들어 'Stack'을 검색하려면 'Sta'를 입력하여 trie를 검색하면 'Sta'로 시작하는 모든 단어가 반환됩니다.

문제가 발생하면 단어별로 파일 단어를 탐색하여이를 trie에 넣을 수 있습니다. 모든 단어에 '카운트'입력란을 추가하십시오. 이제 수정 된 try에 삽입하면 'count'를 증가시킬 수 있습니다. 이제 당신은 트라이의 모든 단어를 세어 봅니다.

1G 파일의 대부분의 단어가 반복되므로 메모리 사용량이 너무 많아서는 안된다고 가정합니다. 파일을 한 번만 트래버스하면됩니다. 또한이 트라이를 사용하면 성능 저하없이 한 단어 이상을 검색 할 수 있습니다.

편집 :

당신이 정확히 일치를 필요로하는 경우의 HashMap가, 또한 좋은 해결책이 @Bananeweizen에 동의해야

.단어 하나 하나를 읽고 HashMap에 넣으십시오. 메모리 사용은 try와 동일해야합니다.