2017-11-22 15 views
0

自分のエンティティでNERの空白のモデルを訓練したいと思います。これを行うために、私は(私は関連する各列に1例の行を提供します)。CSV形式で、現在で、次の形式でエンティティタグを備えたデータセットを使用する必要があります。SpaCy NERのトレーニングデータセットをフォーマットする


コラム:文を

値:[ 'たい; @コマンド; 2; 6'、 'りんご'; 7;フルーツ@ 13' ]

:データ

値:私はりんご


列をしたいです


コラム:エンティティ

値:

値をentity_types:私は列が


@fruitを@コマンドボット/ @コマンド@;ボット/ @食品/ @フルーツ@


SpaCyのNERを訓練するためには、訓練データがjson i nは次の形式:

TRAIN_DATA = [ 
    ('Who is Shaka Khan?', { 
     'entities': [(7, 17, 'PERSON')] 
    }), 
    ('I like London and Berlin.', { 
     'entities': [(7, 13, 'LOC'), (18, 24, 'LOC')] 
    }) 
] 

Link to the relevant part in the SpaCy Docs

私はスペイシーが必要とする形式にcsvファイルからデータをフォーマットし直すことができる方法のための解決策を見つけることを試みたが、私はのように失敗しましたまだ。データセットには、テキスト文字列、エンティティ名、エンティティタイプ、エンティティオフセットのすべての必要な情報が含まれていますが、正しい形式で取得する方法はわかりません。

私はこれをどのように達成するかに関するすべての助けに感謝します!

答えて

2

質問からもCSV抽出について質問しているかどうかは100%明確ではありませんでした。だから、これは問題ではないと思います。 CSVデータが乱雑で、1つの文字列に複数のものが含まれている場合は、splitに電話をかけてハッキリしなければならない場合があります)。

あなたはこのような形式で、「文」と「データ」欄を抽出することができるしている場合、あなたはすでに、実際スペイシーのトレーニング形式に非常に近いです:

[{ 
    'sentence': 'I want apples' 
    'data': [('want', '@command', 2, 6) ('apples', '@fruit', 7, 13)] 
}] 

それはあなたのデータのように思えますspaCyと比較して、末尾の文字を別々に、オフセットが+1とカウントします。だから、1を引いて調整する必要があります。私はおそらく、この多くの冗長それがあるべきよりも作ってるんだが、私は、これはそれが簡単に従うことになり願っています:

[ 
    ('I want apples', {'entities': [(2, 5, 'COMMAND'), (7, 12, 'FRUIT')]}) 
] 
+0

感謝:

TRAIN_DATA = [] for example in your_extracted_data: # see example above entities = [] for entity in example['data']: # iterate over the entities text, label, start, end = entity # ('want', '@command', 2, 6) label = label.split('@')[1].upper() # not necessary, but nicer end = end - 1 # correct the end character index entities.append((start, end, label)) # add training example of (text, annotations) tuple TRAIN_DATA.append((example['sentence'], {'entities': entities})) 

これは、あなたがこのように見えるデータを訓練与える必要がありますあなたの答えは本当に私を助けてくれていて、私が理解しようとしていたものです! コードが抽出されたデータにどのように作用するのか分かりますが、CSV抽出プロセスのステップがまだありません。あなたは、CSVには1つの文字列にたくさんのものが含まれていましたが、私はすべてのものをハックして、 'sentence'列と10の' data'列を含むpandas dfを残しました。 – Dionysos

+0

したがって、 'data 'セルには、' 'want' '、' @command'、2、6'や '' NaN'のようなものが含まれています。あなたが例として挙げた形式、あるいはより具体的には、この形式とはどのようなものなのでしょうか? 辞書の中にネストされたリストの中にネストされたタプルで構成されていると仮定していますか? – Dionysos

+0

はい - 目的の形式は、文字列(テキスト)と辞書を含むタプルのリストです。辞書には1つのエントリ「エンティティ」があり、その値は2つの整数(開始および終了インデックス)と文字列(ラベル)からなるタプル(トリプル)のリストです。私はパンダのデータフレームに精通しているわけではありませんが、一般的なユースケースのように思えるので、これを理解できると確信しています。長い文字列しか抽出できない場合でも、フォーマットが一貫している限り、Pythonで「split」、「strip」などのハッキングコンバータスクリプトを書くことができます。 –

関連する問題