2

私はNLTKのPOSタガーを使用しています:

...
nltk.pos_tag(nltk.word_tokenize(tfile[i]))
...

しかし、時々不正確な結果が得られます (JJ を取得する必要があるときに NN など。タグ付けしたいテキストはかなり特定のビジネス ドメイン内にあります...ここでどのドメインを言うかは自由ではありません)。確かに、私は Python や NLTK の専門家ではありませんが (ただし、それに取り組んでいます)、タガーの精度を向上させる方法はないかと考えていました。

タガーは、与えられたテキストを事前にタグ付けされたテキストのコーパスと比較することによって機能することを理解していると思います。私の自然な傾向は、このコーパスに自分でタグ付けした一連の文を追加しようとすることです...しかし、これを行う方法がわかりません。

自分のテキストをコーパスに追加する方法 (完全に新しいものを開始するのではなく、既存のテキストに追加することをお勧めします)、またはタグ付けの精度を向上させるための他の提案がある場合は、アドバイスをいただければ幸いです。私の目的のために、私はそれを聞きたいです。

ありがとうございました!

4

3 に答える 3

4

おそらくnltk に関する GoogleCode の本をすでに見たことがあるでしょう。私は自分で非常にゆっくりと作業を進めてきました.POSタグ付けにはまだ取り組んでいませんが、ツールを使用するのに十分熟達したときに最終的にやりたいことの1つです. いずれにしても、第 5 章のセクション 2 では、タグ付きトークンの独自のセットを作成するための次のテキストと例を取得します (すべての人に申し訳ありませんが、テキストから直接コピーしました)。

>>> tagged_token = nltk.tag.str2tuple('fly/NN')
>>> tagged_token
('fly', 'NN')
>>> tagged_token[0]
'fly'
>>> tagged_token[1]
'NN'

5.2 からの続き:

タグ付きトークンのリストを文字列から直接作成できます。最初のステップは、文字列をトークン化して個々の単語/タグ文字列にアクセスし、次にこれらのそれぞれを (str2tuple() を使用して) タプルに変換することです。

>>> sent = '''
... The/AT grand/JJ jury/NN commented/VBD on/IN a/AT number/NN of/IN
... other/AP topics/NNS ,/, AMONG/IN them/PPO the/AT Atlanta/NP and/CC
... Fulton/NP-tl County/NN-tl purchasing/VBG departments/NNS which/WDT it/PPS
... said/VBD ``/`` ARE/BER well/QL operated/VBN and/CC follow/VB generally/RB
... accepted/VBN practices/NNS which/WDT inure/VB to/IN the/AT best/JJT
... interest/NN of/IN both/ABX governments/NNS ''/'' ./.
... '''
>>> [nltk.tag.str2tuple(t) for t in sent.split()]
[('The', 'AT'), ('grand', 'JJ'), ('jury', 'NN'), ('commented', 'VBD'), ('on', 'IN'), ('a', 'AT'), ('number', 'NN'), ... ('.', '.')]

上記の「送信された」変数は、実際には生のタグ付きテキストのように見えます。これは、自分のコンピューターの nltk_data ディレクトリに移動し、corpora/brown/ 内の何かを調べることで確認できるため、このフォーマットを使用して独自のタグ付きテキストを作成し、次に、それを使用して独自のタグ付きトークンのセットを構築します。

独自のタグ付きトークンをセットアップしたら、タグ付きトークンに基づいて独自のユニグラム タガーをセットアップできるはずです (5.5 以降)。

>>>unigram_tagger = nltk.UnigramTagger(YOUR_OWN_TAGGED_TOKENS)

最後に、タグ付けされたテキストは非常に小さなサンプル (したがって不正確) である可能性が高いため、フォールバック タガーをリストして、失敗したときにフォールバックが助けになるようにすることができます。

>>> t0 = nltk.UnigramTagger(a_bigger_set_of_tagged_tokens)
>>> t1 = nltk.UnigramTagger(your_own_tagged_tokens, backoff=t0)

最後に、前述の第 5 章で説明した、n グラムの違い、バイグラム、ユニグラムなどを調べる必要があります。

いずれにせよ、第 5 章まで読み進めると、テキストにタグを付けるいくつかの異なる方法が表示されます (私のお気に入りである正規表現タガーも含まれます!)。これを行うには多くの方法があり、複雑すぎてこのような短い投稿で十分にカバーできません。

emptor の警告: 私はこのコードのすべてを試したわけではないので、解決しようとしている解決策として提供します。私が間違いを犯した場合は、それらを修正するのを手伝ってください.

于 2012-10-22T20:03:00.820 に答える
2

「NLTK タガーを改善するにはどうすればよいか」という質問がよく寄せられます:-) タガーをトレーニングするためのコーパスを手作りすることはお勧めしません。タガーが新しいテキストで適切に機能するには、大量のデータが必要です。

努力をしたい場合にできることは、コーパスを「ブートストラップ」することです。ドメイン内の一連のテキストに NLTK タガーを使用してタグを付け、サブセットの間違いを手動で修正します (予測可能であれば簡単です)。その結果を使用して、より優れたタガーをトレーニングします。プロセスを繰り返すこともできるので、自分の材料をより多く手作業できれいにすることができます. 新しいタガーはまだ比較的少量のテキストに基づいているため、@erewok が示すようにデフォルトのタガーをフォールバックとして追加できます。同じことを尋ねるこの質問も参照してください。

于 2012-10-30T22:50:28.823 に答える
0

@erewok が指摘しているように、バックオフ タガーを使用することは、物事を改善する良い方法です。最も正確なものから始めます。タグ付けできない場合、または計算された確率が設定されたしきい値を下回っている場合は、次の (精度の低い) メソッドを試してください。最後の「名詞であると仮定する」ステップでさえ、測定可能な改善を行うことができます。

ユニグラムやバイグラムのタガーなどは、一般的にそれほど正確ではありません。最初は Naive Bayes タガーから始めることをお勧めします (これらは O'Reilly の本で説明されています)。これは、Unigram タガーまたは Wordnet タガー (Wordnet で単語を検索し、最も頻繁に使用される例を使用する) をバックオフ タガーとして使用できます。

次に、依存機能のサポートにより、単純ベイズよりも正確であると見なされる MaxEnt (最大エントロピー) タガーに移行できます。ただし、これは時間がかかり、実装にはより多くの労力が必要です。最終結果は価値がない場合があります。NLTK バージョンも少し使いにくい場合があります。

これらのタガーをトレーニングするために、NLTK にはさまざまなコーパスが付属しています。あなたのドメインについて何も知らないので、それらがどれほど役立つかはわかりませんが、Penn Treebank のサブセット、いくつかのドメイン固有のコーパス、さまざまな言語などが含まれています。見てください。

O'Reilly の本と同様に、Jacob Perkins の Python Text Processing NLTK Cookbookをお勧めします。これには、この種の実用的な例が含まれています。

于 2012-10-23T12:50:58.693 に答える