2017-04-30 8 views
3

アフリカの政治的暴力に関する新聞記事を集計し、インシデントを識別してコード化する研究プロジェクトを監督します。私たちは、あなたがここにデータセットを見ることができるなど、そして事件が起こったとき、関与行為者は、人々の数が殺さを追跡:機械学習/ NLP対キーワード構造化されていないデータを構造化データに変換するための検索

https://docs.google.com/spreadsheets/d/1_QYl4xhMu5nZVluprOgRs6rUzgkkBemapdsg5lFzKU/pubhtml

これは労働集約的なプロセスであると私はマシンを考えます学習が役に立ちます。私は最良のアプローチを見つけようとしています。

私の質問:各記事のコーディング方法を決定するために一連のキーワードを使用する方が良いですか?私。

if "boko haram" in article: 
    code Boko Haram 

or 

if [list of locations] in article: 
    code location 

または、既存のデータセットと記事のテキストを使用して、機械抽出を使用してフィーチャ抽出を行うことはできますか?

いくつかの機能は簡単です。記事で暴力的なイベントが記述され、Boko Haramが記述されている場合は、Boko Haramをコーディングします。あるいは、爆弾が言及されていれば、爆弾をコードします。

さらに複雑なものもあります。イベントが「宗派的」であるかどうかを判断するには、民族間の紛争が参照される暴力的な出来事を探します(「フルナニ」、「イボ」など)

774地区のリストに基づいて場所をコードします。ここでの課題は、同じ場所に複数のスペルが存在することです。イベントは通常「最後の火曜日」または「水曜日の夜」と記述されるため、時間も複雑です。

私は少し前にTextBlobのNaive Bayesクラシファイアを使って場所を把握しようと試みました。私は2つの問題にぶつかった。私のプログラムは決して終わらないだろう。私は2,000ワードの記事でnlpを実行すると、Macbook Airが処理できるよりも多くのジュースが必要と仮定しています。もう1つは記事のテキストのエンコードの問題でした。私はpython 3に切り替えることでこれを解決するのに役立つと期待しています。

私はこれにいくつかの時間をシンクするつもりなら、私は取るべき最善の道に関するいくつかの推奨が大好きです。それが実際に機械学習であれば、ナイーブベイズ以外の何かを使うべきでしょうか?たぶん私は雲の中でこれを実行して、私はより多くの力を持っているはずですか? TextBlobとは別のパッケージですか?

ガイダンスは大歓迎です!

答えて

0

私は最初の質問を投稿して以来、SklearnのNaive BayesとSupport Vectors Machineだけでなく、TextBlobのNaive BayesとDecisionTreeクラシファイアをうまく​​適用しました。また、Python3と正しいエンコーディング(私のデータセット 'latin1'用)が私の以前の文字列のエンコーディングとデコードの問題を解消したことを追加するべきです。

TextBlobための鍵は、カスタム特徴抽出を構築することでした:

def simple_define_features(tokens): 
    lga_state = pd.read_csv('lgas.csv') 

    lga_state = lga_state[['State', 'LGA']] 
    states = list(set(lga_state['State'])) 

    state_lga = {} 
    for state in states: 
     lgas = lga_state[lga_state['State']==state] 
     lga_list = list(lgas['LGA']) 
     state_lga[state.strip('State').rstrip()] = lga_list 

    features = {} 
    for state in list(state_lga.keys()): 
     features['count({})'.format(state)] = tokens.count(state) 
     features['has({})'.format(state)] = (state in tokens) 
    for lga in lga_list: 
     features['count({})'.format(lga)] = tokens.count(lga) 
     features['has({})'.format(lga)] = (lga in tokens) 

    return features 

この関数は、この場合には、キーワードのセットに対してそれぞれの記事をチェックした場所、および機能の辞書を構築します。 http://www.nltk.org/book/ch06.html

現在、以下の関数を使用して、状態レベルの位置を推測するために75%の精度を返すことができました。私のトレーニングセットはかなり小さく、わずか約4000行であることに留意してください。

機能は次のとおりです。

def tb_dt_classifier(json_file, feature_function, test_text, test_label): 
    with open(json_file, 'r') as f: 
     cl = DecisionTreeClassifier(f, format='json', feature_extractor=feature_function) 
    test_text['guess'] = test_text.apply(lambda x: cl.classify(x)) 
    return test_text['guess'] 

TextBlobはしかし、非常に遅いです。

Sklearnは、はるかに高速であることが証明されています。違いは、私が知る限り、Sklearnはすべてをベクトルに変換しなければならないということです。この場合、ラベルのために、2つ以上の変数がある場合、私はpd.get_dummies()astype('category').cat.codesでバイナリ変数に対して行ったダミー変数を作成しました。そこからSklearnのカウントベクトル化器がベクトルを作成します。ここで

は、私が使用してきた機能である:

def text_classifier_SVM(df,train_text,train_output, test_text, test_output): 
    text_clf = Pipeline([('vect', CountVectorizer()), 
        ('tfidf', TfidfTransformer()), 
        ('clf', SGDClassifier(loss='hinge', penalty='l2', 
              alpha=1e-3, n_iter=5, random_state=42)), 
    ]) 
    _ = text_clf.fit(df[train_text], df[train_output]) 
    predicted = text_clf.predict(df[test_text]) 
    return np.mean(predicted == df[test_output]) 

その後、私はまだやるために微調整をたくさん持っているが、これはいくつかの意味のある結果を返すために開始した、と多くのより効率的であると思われます可能なすべてのパターンを推測し、複雑なキーワード検索に組み込みます。

関連する問題