2017-02-11 8 views
0

나는 분류 작업을 수행해야하는 데이터로 만든 사용자 지정 데이터가 있습니다. movie_reviews corpora에 포함 된 것과 동일한 형식으로 데이터 세트를 보유하고 있습니다. nltk 문서에 따르면 다음 코드를 사용하여 movie_reviews corpora에 액세스합니다. 어쨌든 nltk_data/corpora 디렉토리에 임의의 커스텀 콜라를 추가하고 기존의 코퍼스에 액세스하는 것과 같은 방법으로 해당 코커에 액세스 할 수 있습니까?nltk에서 로컬 컴퓨터에 사용자 지정 몸체를 추가하는 방법

import nltk 
    from nltk.corpus import movie_reviews 

    documents = [(list(movie_reviews.words(fileid)), category) 
     for category in movie_reviews.categories() 
     for fileid in movie_reviews.fileids(category)] 

답변

1

동안 당신의 신체가 내장 NLTK 코퍼스, 즉 잘못된처럼 보이게하기 위해 NLTK를 해킹 수 그것에 대해 갈 길. nltk은 풍부한 자료 모음을 제공하여 nltk_data 디렉토리로 이동하거나 nltk 소스를 해킹하지 않고도 어디서나 코퍼를 읽을 수 있습니다. nltk의 자체 corpora는 뒤에서 동일한 코퍼스 독자를 사용하므로 독자는 동일한 내장 된 corpora의 모든 방법과 동작을 갖게됩니다.

의이 movie_reviews 코퍼스가 nltk/corpora/__init__.py에 정의하는 방법을 보자 : 당신은 LazyCorpusLoader 부분을 무시할 수

movie_reviews = LazyCorpusLoader(
    'movie_reviews', CategorizedPlaintextCorpusReader, 
    r'(?!\.).*\.txt', cat_pattern=r'(neg|pos)/.*', 
    encoding='ascii') 

; 그것은 당신의 프로그램이 결코 사용하지 않을 가능성이 큰 코사인을 제공하기위한 것입니다. 나머지는 영화 검토 자료가 CategorizedPlaintextCorpusReader으로 읽혀지고 파일의 길이가 모두 .txt으로 끝나고 리뷰가 서브 디렉토리 posneg에있는 것으로 분류되어 카테고리로 분류된다는 것을 보여줍니다. 마지막으로, 코퍼스 인코딩은 ascii입니다. 따라서 자신의 코퍼스를 다음과 같이 정의하십시오 (필요에 따라 값을 변경하십시오).

mycorpus = nltk.corpus.reader.CategorizedPlaintextCorpusReader(
    r"/home/user/path/to/my_corpus", 
    r'(?!\.).*\.txt', 
    cat_pattern=r'(neg|pos)/.*', 
    encoding="ascii") 

그게 전부입니다. 이것이 마치 nltk에서 제공하는 코퍼스 인 것처럼 mycorpus.words(), mycorpus.sents(categories="neg") 등으로 호출 할 수 있습니다.

+0

큰이 작동 :) 감사합니다 많이 Logged – Janitha

0

먼저 새로운 자료의 실제 데이터를 nltk_data/corpora/ 디렉토리에 넣으십시오. 그런 다음 nltk.corpus에 대한 __init__.py 파일을 편집해야합니다. 텍스트 편집기에서이 파일

import nltk 
print(nltk.corpus.__file__) 

열기를 당신은 대부분의 파일이 LazyCorpusLoader 객체를 생성하고 전역 변수에 할당되는 것을 볼 수 있습니다 : 당신은 수행하여이 파일의 경로를 찾을 수 있습니다. 방금 위의 예와 같은 형식으로이 파일에 새 줄을 추가해야 할 새로운 신체를 추가하려면

.... 
verbnet = LazyCorpusLoader(
    'verbnet', VerbnetCorpusReader, r'(?!\.).*\.xml') 
webtext = LazyCorpusLoader(
    'webtext', PlaintextCorpusReader, r'(?!README|\.).*\.txt', encoding='ISO-8859-2') 
wordnet = LazyCorpusLoader(
    'wordnet', WordNetCorpusReader, 
    LazyCorpusLoader('omw', CorpusReader, r'.*/wn-data-.*\.tab', encoding='utf8')) 
.... 

:

그래서 예를 들어, 섹션처럼 보일 수 있습니다. 당신이 movie_reviews라는 이름의 영장이 있고 nltk_data/corpora/movie_reviews에 저장된 데이터가있는 경우 그럼 당신은 같은 라인을 추가 할 것입니다 : LazyCorpusLoader에 대한

movie_reviews = LazyCorpusLoader('movie_reviews', ....) 

추가 인수는 문서 here에서 찾을 수 있습니다.

그런 다음 당신은이 파일을 저장하고 당신은 할 수 있어야 :

from nltk.corpus import movie_reviews 
+0

그리고 어느 날, 당신은 NLTK를 업데이트하고 이러한 변경은 예고없이 닦고됩니다 있었다. 알렉시스의 대답을 듣는 것이 더 안전합니다. – lenz

+0

@bunji - 알렉시스 방식으로 시도했습니다. 효과가 있습니다. UR 가이드 – Janitha

+0

@Janitha, 도와 줘서 고맙습니다. 나는 기존의 자료와 같이 가져올 수 있어야한다는 의미로 "기존의 자료에 접근하는 것과 같은 방식으로"그것에 접근하라는 귀하의 요청을 잘못 해석 한 것 같습니다. 내 나쁜 ... – bunji

0

그래, 내가 제공하는 솔루션에 약간의 문제가 있었고 나를 위해 일한 easiet 방법은 'corpora'디렉토리에 내 폴더와 하위 폴더를 만든 다음 init을 편집하는 것입니다. py doc.

그래서 내 경우에는 내가 만든 코퍼스는 VC이고 하위 폴더 audio_them, audio_us, video_them, video_us

vc = LazyCorpusLoader(
    'vc', CategorizedPlaintextCorpusReader, 
    r'(?!\.).*\.txt', 
cat_pattern = r'(audio_them|audio_us|video_them|video_us)/.$ 
    encoding="ascii")