2012-04-18 1 views
5

Weka java API를 사용하여 문서 분류를하려고합니다.StringToWordVector()의 출력 해석 - Weka

다음은 데이터 파일의 내 디렉토리 구조입니다.

+- text_example 
| 
+- class1 
| | 
| 3 html files 
| 
+- class2 
| | 
| 1 html file 
| 
+- class3 
    | 
    3 html files 

'TextDirectoryLoader'로 만든 'arff'파일이 있습니다. 그런 다음 filter.setOutputWordCounts(true)과 함께 만들어진 arff 파일에 StringToWordVector 필터를 사용합니다.

다음은 필터가 적용된 출력의 샘플입니다. 나는 명확한 것들을 얻을 필요가있다.

@attribute </form> numeric 
@attribute </h1> numeric 
. 
. 
@attribute earth numeric 
@attribute easy numeric 

이 거대한 목록은 초기 html 파일의 내용을 토큰 화해야합니다. 권리?

그리고 내가 가진

, 처음 3 개 항목에 대한 클래스 속성이 존재하지 않는 이유

@data 
{1 2,3 2,4 1,11 1,12 7,..............} 
{10 4,34 1,37 5,.......} 
{2 1,5 6,6 16,...} 
{0 class2,34 11,40 15,.....,4900 3,... 
{0 class3,1 2,37 3,40 5.... 
{0 class3,1 2,31 20,32 17...... 
{0 class3,32 5,42 1,43 10......... 

? (class1이 있어야합니다). 앞에 오는 0은 {0 class2, ..}, {0 class3 ..}에서와 같은 의미입니다. 예를 들어 class3 폴더의 세 번째 html 파일에서 정수 32로 식별되는 단어가 5 번 나타납니다. 그냥 32라는 단어 (토큰)를 얻으려면 어떻게해야합니까?

피쳐 벡터의 크기를 어떻게 줄일 수 있습니까? 모든 특징 벡터를 같은 크기로 만들 필요가 없습니까? (트레이닝 세트에서 가장 자주 사용되는 용어를 말하고 나중에 테스트에 관해서는 100 개의 용어 만 사용하는 것을 고려해보십시오. 이렇게하면 완전히 새로운 단어가 생기면 어떻게 될까요? 테스트 단계에서 분류자가 무시할 것인가?).

여기에 뭔가가 있습니까? 나는 Weka가 처음이야.

다른 사람이 나에게 StringToWordVector 필터로 만든이 벡터를 사용하는 방법을 설명 할 수 있다면 정말 감사드립니다. (학습 데이터, 차원 축소와 어휘를 만드는처럼 웨카 코드 내에서 발생하는 것들이다?)

답변

8
  1. @attribute의 거대한 목록은 입력에서 파생 된 모든 토큰이 포함되어 있습니다.
  2. @data 섹션이 각 속성에 대한 스파 스 형식이므로 0과 다른 경우에만 값이 표시됩니다. 처음 세 줄의 경우 class 속성은 class1이며 사용자는 볼 수 없습니다 (알 수없는 경우 처음 세 줄의 시작 부분에 0 ?이 표시됨). 왜 이렇게이다? Weka는 내부적으로 (클래스를 포함하는) 공칭 속성을 double로 나타내며 0으로 계산을 시작합니다. 따라서 세 클래스는 내부적으로 class1 = 0.0, class2 = 1.0, class3 = 2.0입니다. 스파 스 형식에서는 0 값이 지정되지 않으므로 처음 세 행에서는 클래스를 볼 수 없습니다. http://www.cs.waikato.ac.nz/ml/weka/arff.html에있는 "스파 스 ARFF 파일"섹션을 참조하십시오.
  3. 색인 n으로 표시되는 단어/토큰을 계산하려면 계산할 수도 있고 Instances 개체 인 경우 attribute(n).name()을 호출 할 수도 있습니다. 이를 위해 n은 0부터 계산을 시작합니다.
  4. 특징 벡터의 차원을 줄이려면 많은 옵션이 있습니다. 가장 자주 사용하는 용어가 100 개 뿐이라면 stringToWordVector.setWordsToKeep(100)입니다. 이것은 모든 수업의 100 단어를 유지하려고 노력할 것입니다. 수업 당 100 단어를 유지하고 싶지 않으면 stringToWordVector.setDoNotOperateOnPerClassBasis(true).동일한 빈도로 여러 단어가있는 경우 100을 약간 상회하게되므로 100은 목표 값의 일종입니다.
  5. 테스트 단계에서 발생하는 새로운 단어에 대해서는 분류하기 전에 모든 인스턴스를 stringToWordVector에게 넘겨야하기 때문에 이런 일은 발생할 수 없다고 생각합니다. 나는 두 클래스 설정을 사용하고 있기 때문에 100 % 확실하지는 않습니다. StringToWordVector은 분류 자에게 아무 것도 말하기 전에 모든 인스턴스를 변환하도록합니다.

일반적으로 Weka KnowledgeFlow 도구를 사용하여 다른 클래스를 사용하는 방법을 시험해 볼 수 있습니다. 거기에서 일하는 법을 아는 경우, Java 코드에 대한 지식을 아주 쉽게 사용할 수 있습니다. 희망이 조금 늦었지만 희망을 도왔습니다.

+0

예 답변을 직접 배웠을 때 ans가 약간 늦었습니다. 그러나 당신의 대답에 감사 드리며 나는 그것을 받아들입니다. 안녕하세요, weka에서 libsvm (래퍼)을 사용하여 하나의 클래스 분류에 대한 경험이 있습니까? 나는 일종의 그것과 붙어있다 – KillBill

+0

@ user601 아니, 미안. 나는 Weka에서 libsvm을 사용하지 않았다. 호기심에서 벗어나 : 혹시 기계 학습/데이터 마이닝 주제에 관한 논문을 쓰고 있습니까? – Malhelo

+0

예 저는 텍스트 분류와 관련된 수석 졸업 논문을 쓰고 있습니다. 비슷한 것을하고 있습니까? – KillBill