2017-10-22 20 views
1

私はCoNLLCorpusReaderをCoNLL2003データセットに使用しようとしています。このデータセットは、4列(一例)を含んでいますNLTKのNEタグConllCorpusReader

WORD  POS CHUNK NE 
U.N.  NNP I-NP I-ORG 
official NN I-NP O 
Ekeus  NNP I-NP I-PER 
heads  VBZ I-VP O 
for  IN I-PP O 
Baghdad NNP I-NP I-LOC 
.   .  O  O 

私はコーパスを作成し、それが動作する - 私はPOSタグとチャンクタグと言葉、sentsとタプルを取得することができます。

質問は、どのように私のコーパスから名前付きエンティティタグを取得できますか?私はcorpus.raw()メソッドがあることを知っていますが、実際にcorpus.iob_words()のようなものでそれを取得する方法はありませんか?私はこの問題を発見しました:https://github.com/nltk/nltk/issues/63しかし、このcorpusReaderの最新バージョンでは、取得したい列のリストを変更するために使用できる追加の引数はiob_wordsメソッドにありません。

+0

ホホホ古い問題#63再び私を傷つける...回避策がありますが、 。これを解決するための基本的な方法は、CoNLLコーパスリーダーを書き換えて拡張して、不特定の番号を読み取ることです。列の – alvas

+1

コードを見ると、既に不特定多数の列が読み込まれています!それはただの特別な列を選択するためのインターフェイスを持っていません。 – alexis

+0

クール!それを指摘してくれてありがとう@alexis。それについて知らなかった。今すぐコードベースにあなたの答えを得ることができます! – alvas

答えて

1

自分自身を助ける必要があるように見えます。これを試してみてください。ConllCorpusReaderを拡張して、iob_words()NE列を選択するように指示することができます。これは、デフォルトのCHUNK列の代わりに使用されます。 iob_sents()chunked_words()およびchunked_sents()も同様に修正されるべきである。

class betterConllReader(ConllCorpusReader): 

    def iob_words(self, fileids=None, tagset=None, column="chunk"): 
     """ 
     :return: a list of word/tag/IOB tuples 
     :rtype: list(tuple) 
     :param fileids: the list of fileids that make up this corpus 
     :type fileids: None or str or list 
     """ 
     self._require(self.WORDS, self.POS, self.CHUNK) 
     def get_iob_words(grid): 
      return self._get_iob_words(grid, tagset, column) 
     return LazyConcatenation(LazyMap(get_iob_words, self._grids(fileids))) 

    def _get_iob_words(self, grid, tagset=None, column="chunk"): 
     pos_tags = self._get_column(grid, self._colmap['pos']) 
     if tagset and tagset != self._tagset: 
      pos_tags = [map_tag(self._tagset, tagset, t) for t in pos_tags] 
     return list(zip(self._get_column(grid, self._colmap['words']), pos_tags, 
        self._get_column(grid, self._colmap[column]))) 

ハードコードされた"chunk"をキーワード引数に置き換えていました。もう少し作業すれば、複数の列を選択することができます(iob_*()の場合はchunked_*()バリアントの場合はそれほど明確ではありません)。

+0

ええ、ありがとう!私は新しいクラスも作成することにしました。実際には.iob_words()をコピー貼り付け、返されたリストにNEカラムを追加した4つのコンポーネントすべてを返す新しい.get_all_tags()メソッドを作成しました。 –

+0

@alexis、nltkはこのためのPRを作成しました。見て、いくつかの提案/レビューをするのに役立つでしょうか? https://github.com/nltk/nltk/pull/1966#issue-171312566 – alvas

+1

@alvasプルリクエストを承認しないでください。これを行うのは間違った方法です。私は今週のPRについてコメントします。 – alexis

関連する問題