2011-07-26 6 views
3

私はニュース業界テキストフォーマットNITFの各記事のXMLファイルを含むNew York Times Annotated Corpusでいくつかの作業をするためにNLTKを使用しようとしています。NLTKのXMLCorpusReaderをマルチファイルコーパスで使用できますか?

私はそうのように問題なく、個々の文書を解析することができます

from nltk.corpus.reader import XMLCorpusReader 
reader = XMLCorpusReader('nltk_data/corpora/nytimes/1987/01/01', r'0000000.xml') 

私も全体のコーパスで作業する必要があります。

reader = XMLCorpusReader('corpora/nytimes', r'.*') 

をが、これは使用可能なリーダーオブジェクトを作成しません: 私はこれをやってみました。例えば

len(reader.words()) 

戻り

raise TypeError('Expected a single file identifier string') 
TypeError: Expected a single file identifier string 

は、どのように私はNLTKにこのコーパスを読んでいますか?

私はNLTKを初めて利用していますので、どんな助力もありがとうございます。

答えて

5

私はNLTKのエキスパートではありませんので、これを行う簡単な方法があるかもしれませんが、丁寧にPython's glob moduleを使用することをお勧めします。 Unix-stleパス名パターン拡張をサポートしています。

これにより、指定した式に一致するファイルの名前がリスト形式で表示されます。 そして、あなたが/する方法を多くのそれらのに応じて、一度に開いている必要があり、あなたができる:

from nltk.corpus.reader import XMLCorpusReader 
for item_path in texts: 
    reader = XMLCorpusReader('nltk_data/corpora/nytimes/', item_path) 

@waffleパラドックスによって示唆されるように:,あなたはできるも削るダウンtextsのこのリストを特定のに合わせて、ニーズ。

3

はい、複数のファイルを指定できます。 (from:http://nltk.googlecode.com/svn/trunk/doc/api/nltk.corpus.reader.xmldocs.XMLCorpusReader-class.html

ここでの問題は、すべてのファイルがcorpora/nytimes/year/month/dateの行に沿ったファイル構造に含まれていると思われることです。 XMLCorpusReaderはディレクトリを再帰的にトラバースしません。すなわち、あなたのコードがXMLCorpusReader('corpora/nytimes', r'.*')の場合、XMLCorpusReaderはcorpora/nytimes/のxmlファイルのみを表示します(つまり、フォルダのみが存在するためnoneです)。corpora/nytimesに含まれるサブフォルダは表示されません。さらに、おそらく*.xmlを2番目のパラメータとして使用することを意味します。

絶対パス(上記のドキュメントではfileidsパラメータの明示的なパスが機能することを指定しています)を作成するためにフォルダをトラバースすることをお勧めします。また、年/月/日付の組み合わせのリストがある場合は、あなたの優位性

+0

おかげワッフルパラドックス。それはとても役に立ちます。 – NAD

4

ここにはマシンの憧れとワッフルのパラドックスのコメントに基づいた解決策があります。 globを用いて物品のリストを作成し、リストとしてXMLCorpusReaderに渡す:

from glob import glob 
import re 
years = glob('nltk_data/corpora/nytimes_test/*') 
year_months = [] 
for year in years: 
    year_months += glob(year+'/*') 
    print year_months 
days = [] 
for year_month in year_months: 
    days += glob(year_month+'/*') 
articles = [] 
for day in days: 
    articles += glob(day+'/*.xml') 
file_ids = [] 
for article in articles: 
    file_ids.append(re.sub('nltk_data/corpora/nytimes_test','',article)) 
reader = XMLCorpusReader('nltk_data/corpora/nytimes_test', articles) 
関連する問題