2016-12-24 4 views
3

文が実際には意味をなさないかどうかを知りたいのですが。例Pythonの文構造でテキストを分類する

Hello, how are you today? --> Correct 
Hello, are today are how --> Incorrect 

のためにこれまでのところ、私は次のことを行い、このコードを持っている:

1 - nltk.brownsコーパスから20の000の文章を取得します。
2 - スタンフォードPOSタガーを使用してタグのすべての文章

from nltk.corpus import brown 
from nltk.tokenize import sent_tokenize, word_tokenize 
from nltk.classify import accuracy 
from nltk.tag import StanfordPOSTagger 
from nltk import pos_tag 
import string 
import random 

PUNC = [x for x in string.punctuation] + ["''", "``"] 

def download_data(target_path): 
    brown_data = brown.sents() 
    i = 0; n = 0 
    with open(target_path, 'w') as data_file: 
     while n < 20000: 
      for sent in sent_tokenize(' '.join(brown_data[i])): 
       updated_list = [x for x in word_tokenize(sent) if x not in PUNC] 
       if n > 10000: 
        random.shuffle(updated_list) 
       sent = ' '.join(updated_list) + '\n' 
       if sent != '\n': 
        data_file.write(sent) 
        n += 1 
       i += 1 

def get_data(data_path): 
    with open(data_path, 'r') as data_file: 
     return [x for x in data_file.readlines()] 

def parse_data(data, tagger): 
    parsed_data = [] 
    for i in range(len(data)): 
     if i > 10000: 
      parsed_data.append((tagger.tag(word_tokenize(data[i].replace('\n', ''))), False)) 
     else: 
      parsed_data.append((tagger.tag(word_tokenize(data[i].replace('\n', ''))), True)) 
    random.shuffle(parsed_data) 
    return parsed_data[:15000], parsed_data[15000:] 

if __name__ == '__main__': 
    data_path = 'data.txt' 

    stanford_jar_path = 'stanford-postagger.jar' 
    stanford_model_path = 'models/english-bidirectional-distsim.tagger' 

    tagger = StanfordPOSTagger(model_filename=stanford_model_path, 
           path_to_jar=stanford_jar_path) 

    #download_data(data_path) 
    all_data = get_data(data_path) 
    train_data, test_data = parse_data(all_data, tagger) 

それでは、どのように私は分類する、例えば分類器を訓練することができます - (不正データのための)最後の10の000の文章
3の単語をミックス私が提供したデータに基づいて、新しいテキストが正しいか間違っているか?

誰かより良い提案があれば、私も開いています。

+0

このような問題を自然に解決する技術的な方法は、(a)関心のある分野のテキスト(ある種のRNN/LSTM、最先端の仕事をしたい場合) (b)良いと悪い文の既知のコレクションに対して許容可能な確率カットオフを確立し、最後に(c)バイナリのケースを分離するために新しい、目に見えない文にモデルが与える文の確率を使用する。既存の回答と同様に、おそらく最初に、これが価値あるものかどうかを確認する必要があります。ただし、クイックアンドダーティーなバイグラムまたはトライグラムのモデルを使用してください。 – fnl

答えて

0

私は、品詞の連続の有無を調べます。あなたの例としては、以下のPOS連続シーケンスに変換することができます:あなたは2つのポーズのすべての可能な組み合わせを注文すると、0と1の特徴ベクトルを構築

[('NNP', 'VBP'), ('VBP', 'NN'), ('NN', 'VBP'), ('VBP', 'WRB')] # incorrect 
[('NNP', 'WRB'), ('WRB', 'VBP'), ('VBP', 'PRP'), ('PRP', 'NN')] # correct 

場合、あなたのアルゴリズムを訓練するためにこれらのベクターを使用することができます。

0

トレーニングセットの機能を作成する必要がある場合は、手順に従います。私は2と3ワードのnグラムをフィーチャーとして使用し、POSの2と3の長さのnグラムを使用します。たとえば、すべての文章を取って、すべてのビッグ/トリグラムを見つけて2進化します(現在のセンテンスに含まれていない場合は0にし、そうであれば1にします)。私はPOSのために同じことをするだろう。 POSのbi/trigramsを作り、それらを二進化する。次に、予測可能なパワーが存在するかどうかを知るために、素朴なベイなどを使用できます。

+0

は特徴としてnグラムを追加し、特徴としてのポグラムはちょうどposグラム以上の精度を向上させるだろうか? –

+0

「ブラウン・キツネ」が「キツネ・ブラウン」よりもずっと頻繁に出現するはずなので、予測力があると思います。互いに隣り合う文章には決して出現しない単語の特定の組み合わせが存在する。もちろん、経験的にこれをテストする必要があります。 –

+0

どうすれば2値化できますか?私は0と1の長い文字列で終わるでしょうか? @TedPetrou –

0

品詞タグは良いですが、私はn-gram言語モデルがあなたの仕事に十分に適していると考えています。ここで私の前提は、POSタグは数が少なく(Penn Treebankによると36)、コーパスの語彙サイズと比較してばらつきの数は少なくなります。したがって、POSタグは良いパフォーマンスを提供するかもしれませんが、あなたの分類器を誤解させるかもしれません。 (私の個人的な意見)

最大5グラムの言語モデルで実験を行うことができます。全てのnグラムが分類器の特徴となる。 nグラムの数が多いほど複雑さは増しますが、より正確になるはずです。

分類には、生成モデルと差別モデルの両方を考慮することができます。生成モデルの場合、Naive-Bayesを考慮することができ、識別モデルの場合は、SVMまたはロジスティック回帰のいずれかを考慮することができます。これらの分類子は、テキスト分類タスクでうまく機能します。

関連する問題