2011-07-27 9 views
2

NLTK用に分類されたXMLコーパスリーダーを作成した人はいますか?誰もNLTK用の分類されたXMLコーパスリーダーを持っていますか?

私はAnnotated NYTimesコーパスを使用しています。これはXMLコーパスです。 XMLCorpusReaderでファイルを読むことができますが、NLTKのカテゴリ機能のいくつかを使用したいと思います。 NLTKリーダーをサブクラス化するための​​があります。私は先に進んでこれを書くことができますが、誰かがすでにこれをやっているなら、時間を節約したいと考えていました。

私が書いたものを投稿します。

答えて

1

NLTK用の分類されたXMLコーパスリーダーです。これはthis tutorial. に基づいています。これにより、NLTKのカテゴリベースの機能をNew York Times Annotated CorpusのようなXML Corporaで使用できます。

コールこのファイルCategorizedXMLCorpusReader.pyとして、これをインポートする:あなたは、その後、他のNLTKリーダーのようにこれを使用することができます

import imp                                                      
CatXMLReader = imp.load_source('CategorizedXMLCorpusReader','PATH_TO_THIS_FILE/CategorizedXMLCorpusReader.py') 

。たとえば、

CatXMLReader = CatXMLReader.CategorizedXMLCorpusReader('.../nltk_data/corpora/nytimes', file_ids, cat_file='PATH_TO_CATEGORIES_FILE') 

私はまだ修正や提案を歓迎していますので、まだNLTKを考え出しています。

# Categorized XML Corpus Reader                                                 

from nltk.corpus.reader import CategorizedCorpusReader, XMLCorpusReader 
class CategorizedXMLCorpusReader(CategorizedCorpusReader, XMLCorpusReader): 
    def __init__(self, *args, **kwargs): 
     CategorizedCorpusReader.__init__(self, kwargs) 
     XMLCorpusReader.__init__(self, *args, **kwargs) 
    def _resolve(self, fileids, categories): 
     if fileids is not None and categories is not None: 
      raise ValueError('Specify fileids or categories, not both') 
     if categories is not None: 
      return self.fileids(categories) 
     else: 
      return fileids 

     # All of the following methods call the corresponding function in ChunkedCorpusReader                                  
     # with the value returned from _resolve(). We'll start with the plain text methods.                                  
    def raw(self, fileids=None, categories=None): 
     return XMLCorpusReader.raw(self, self._resolve(fileids, categories)) 

    def words(self, fileids=None, categories=None): 
     #return CategorizedCorpusReader.words(self, self._resolve(fileids, categories))                                   
     # Can I just concat words over each file in a file list?                                         
     words=[] 
     fileids = self._resolve(fileids, categories) 
     # XMLCorpusReader.words works on one file at a time. Concatenate them here.                                    
     for fileid in fileids: 
      words+=XMLCorpusReader.words(self, fileid) 
     return words 

    # This returns a string of the text of the XML docs without any markup                                      
    def text(self, fileids=None, categories=None): 
     fileids = self._resolve(fileids, categories) 
     text = "" 
     for fileid in fileids: 
      for i in self.xml(fileid).getiterator(): 
       if i.text: 
        text += i.text 
     return text 

    # This returns all text for a specified xml field                                            
    def fieldtext(self, fileids=None, categories=None): 
     # NEEDS TO BE WRITTEN                                                  
     return 

    def sents(self, fileids=None, categories=None): 
     #return CategorizedCorpusReader.sents(self, self._resolve(fileids, categories))                                   
     text = self.words(fileids, categories) 
     sents=nltk.PunktSentenceTokenizer().tokenize(text) 
     return sents 

    def paras(self, fileids=None, categories=None): 
     return CategorizedCorpusReader.paras(self, self._resolve(fileids, categories)) 
0

申し訳ありませんが、NADがこのコードについて議論するために見つけた唯一の方法でした。私はまた、words()メソッドでカテゴリを使用しようとするときに、小さなバグを見つけて使用しています。ここをクリック:https://github.com/nltk/nltk/issues/250#issuecomment-5273102

私の前でこの問題にぶつかりましたか?また、カテゴリーを機能させるための変更を加えましたか?私の電子メールは私のプロフィールページにあります。あなたがそれについて話したいのですが:-)

関連する問題