Apple(Inc。)に関するツイートとApple(fruit)に関するツイートを区別するモデルを作成するにはどうすればよいですか?


85

「アップル」に関する50のツイートについては、以下を参照してください。私はAppleIncについてのポジティブマッチに手作業でラベルを付けました。それらは以下の1としてマークされています。

ここにいくつかの行があります:

1|“@chrisgilmer: Apple targets big business with new iOS 7 features http://bit.ly/15F9JeF ”. Finally.. A corp iTunes account!
0|“@Zach_Paull: When did green skittles change from lime to green apple? #notafan” @Skittles
1|@dtfcdvEric: @MaroneyFan11 apple inc is searching for people to help and tryout all their upcoming tablet within our own net page No.
0|@STFUTimothy have you tried apple pie shine?
1|#SuryaRay #India Microsoft to bring Xbox and PC games to Apple, Android phones: Report: Microsoft Corp... http://dlvr.it/3YvbQx  @SuryaRay

合計データセットは次のとおりです:http//pastebin.com/eJuEb4eB

「Apple」(Inc)を分類するモデルを作成する必要があります。残りから。

機械学習の一般的な概要を探しているのではなく、コード内の実際のモデルを探しています(Pythonを推奨)。


18
基本的にこれが必要です:en.wikipedia.org/wiki/Bayesian_spam_filtering
eddi 2013年

1
データに手作業でラベルを付けますが、拡張性のあるライブラリが必要です。これは監視ありですか、それとも監視なしですか?
dan 2013年

1
Eddi、コメントありがとう。メールフィルタリングメールが私の脳の中で何かがクリックするのを本当に助けたのを見てください。別の方法で適用しただけで、自分がやろうとしていたことの実際の例を見ることができました。
SAL 2013年


1
魅力的な@NeilMcGuigan。私は彼らのデモ(nlp.stanford.edu:8080/ner/process)にいくつかのテキストを貼り付け、さまざまなモデルが単語を分類する方法に感銘を受けました。
ライアン

回答:


39

私はそれを次のようにします:

  1. 文を単語に分割し、それらを正規化し、辞書を作成します
  2. 単語ごとに、会社に関するツイートに何回出現したか、果物に関するツイートに何回出現したかを保存します。これらのツイートは人間が確認する必要があります。
  3. 新しいツイートが届いたら、辞書でツイート内のすべての単語を見つけ、加重スコアを計算します。会社に関連して頻繁に使用される単語は高い会社スコアを取得し、その逆も同様です。めったに使用されない単語、または会社と果物の両方で使用される単語は、あまりスコアがありません。

2
これについてのあなたの答えをありがとう。上記のコメントと併せてあなたの答えは、私が解決に向けて進むのを本当に助けました。この解決策を磨くのを手伝ってくれませんか?
SAL 2013年

10
これは、ベイズ分類の非公式な説明です。
sanityinc 2013

1
私は「ベイズ分類の擬似コード実装」を好みます:)
AMADANON Inc. 2013

73

あなたが探しているものは、名前付きエンティティ認識と呼ばれています。これは、(最も一般的には)条件付き確率場を使用して、名前付きエンティティについて学習するようにトレーニングされていることに基づいて、名前付きエンティティを見つける統計手法です。

基本的に、単語の内容とコンテキストを調べて(いくつかの単語を前後に振り返って)、単語が名前付きエンティティである確率を推定します。

優れたソフトウェアは、長さや形など、単語の他の特徴を調べることができます(「Vowel-consonant-vowel」で始まる場合は「Vcv」など)。

非常に優れたライブラリ(GPL)はスタンフォード大学のNERです

デモは次のとおりです:http//nlp.stanford.edu8080 / ner /

試してみるサンプルテキスト:

私はアップル本社でアップルを食べていて、コールドプレイの男の娘であるアップルマーティンについて考えました

(3classおよび4class分類子はそれを正しく理解します)


5
本当に面白かったです。のコードを表示することは可能english.conll.4class.distsim.crf.ser.gzですか?このようなものをどのように構築するかを見てみたいです。
ライアン

NERのコードはオープンソースですが、CONLL会議で使用したデータはオープンソースではありません。ただし、ロイターコーパスはNISTでオンラインで見つけることができます。
Neil McGuigan 2013

31

私はこの問題を解決するセミワーキングシステムを持っており、scikit-learnを使用してオープンソース化されており、私が行っていることを説明する一連のブログ投稿があります。私が取り組んでいる問題は、語義の曖昧性解消(複数の語義オプションの1つを選択すること)です。これは、名前付きエンティティの認識と同じではありません。私の基本的なアプローチは、既存のソリューションとある程度競争力があり、(重要なことに)カスタマイズ可能です。

十分な商用結果が得られる可能性のある既存の商用NERツール(OpenCalais、DBPedia Spotlight、およびAlchemyAPI)がいくつかあります。最初にこれらを試してください。

私はこれらのいくつかをクライアントプロジェクトに使用しましたが(ロンドンでNLP / MLを使用して相談します)、それらの再現適合率と再現率)に満足していませんでした。基本的には正確である可能性がありますが(「これはApple Incです」と言う場合、通常は正しいです)、再現率は低くなります(人間にとっては、ツイートは明らかにApple Incに関するものですが、「これはApple Incです」と言うことはめったにありません)。ツイートに合わせたオープンソースバージョンを作成することは、知的に興味深い演習になると思いました。現在のコードは次のとおりです:https//github.com/ianozsvald/social_media_brand_disambiguator

注意します-私はこのアプローチで一般化された語義の曖昧性解消の問題を解決しようとはしていません。あなたがすでに名前を持っている場合はブランドの曖昧性解消(会社、人々など)だけです。だからこそ、この簡単なアプローチがうまくいくと私は信じています。

私はこれを6週間前に開始し、scikit-learnを使用してPython2.7で記述されています。それは非常に基本的なアプローチを使用します。バイナリカウントベクトライザー(単語が出現するかどうかだけをカウントし、回数はカウントしません)を使用して1〜3nグラムでベクトル化し ます。私はTF-IDFでスケーリングしません(ドキュメントの長さが可変の場合、TF-IDFは適切です。私にとって、ツイートは1つか2つの文であり、テスト結果はTF-IDFで改善を示しませんでした)。

私は非常に基本的ですが驚くほど便利な基本的なトークナイザーを使用しています。@#を無視し(したがって、コンテキストが失われます)、もちろんURLを展開しません。次に、ロジスティック回帰を使用してトレーニングしますが、この問題はある程度線形分離可能であるようです(一方のクラスの多くの用語がもう一方のクラスには存在しません)。現在、私はステミング/クリーニングを避けています(私はうまくいくかもしれない最も単純なものを試しています)。

コードには完全なREADMEがあり、ツイートを比較的簡単に取り込んでから、私の提案に従ってテストできるはずです。

これは、人々がAppleコンピュータを食べたり飲んだりしたり、果物を入力したり遊んだりしないため、Appleで機能します。そのため、単語は簡単にカテゴリに分けられます。この条件は、テレビ番組の#definanceのようなものを検討する場合には当てはまらない可能性があります(アラブの春、クリケットの試合、試験の改訂、音楽バンドに関連して#definanceも使用されます)。ここでは、より巧妙なアプローチが必要になる場合があります。

私が持っているブログの記事のシリーズIは、(DataScienceLondonで140人のための短いプレゼンテーションになって)BrightonPythonのユーザーグループに与えた1時間のプレゼンテーションを含め、このプロジェクトを説明します。

LogisticRegression(各分類の確率を取得する)のようなものを使用する場合、信頼できる分類のみを選択できます。そうすれば、リコールと交換することで高精度を強制できます(正しい結果が得られますが、結果は少なくなります)。これをシステムに合わせて調整する必要があります。

scikit-learnを使用した可能なアルゴリズムアプローチは次のとおりです。

  • Binary CountVectorizerを使用します(ほとんどの単語は1回しか出現しないため、短いメッセージの用語カウントは多くの情報を追加するとは思いません)
  • デシジョンツリー分類器から始めます。説明可能なパフォーマンスがあります(例については、ディシジョンツリーの過剰適合を参照してください)。
  • ロジスティック回帰に移行
  • 分類子によって生成されたエラーを調査します(DecisionTreeのエクスポートされた出力を読み取るか、LogisticRegressionの係数を確認し、誤って分類されたツイートをVectorizerに戻して、基になるBag ofWords表現がどのように見えるかを確認します-トークンはより少なくなりますあなたは生のツイートから始めました-分類するのに十分ですか?)
  • このアプローチの有効なバージョンについては、https://github.com/ianozsvald/social_media_brand_disambiguator/blob/master/learn1.pyにある私のサンプルコードをご覧ください。

考慮事項:

  • より大きなデータセットが必要です。私は2000のラベル付きツイートを使用しています(5時間かかりました)。少なくとも、クラスごとに100を超えるバランスの取れたセットが必要です(以下の過剰適合の注記を参照)。
  • トークンライザーを改善して(scikit-learnで非常に簡単)、トークンに#@を保持し、大文字のブランド検出器を追加する可能性があります(ユーザー@ user2425429のメモとして)
  • 物事が難しくなるときは、非線形分類器(上記の@oiezの提案のような)を検討してください。個人的には、LinearSVCの方がロジスティック回帰よりも悪いことがわかりました(ただし、これは、まだ削減していない高次元の特徴空間が原因である可能性があります)。
  • ツイート固有の品詞(@Neilが示唆しているようにStandfordのものではない私の謙虚な意見では-私の経験では貧弱なTwitter文法ではうまく機能しません)
  • トークンがたくさんあると、おそらく次元削減を行いたいと思うでしょう(私はまだこれを試していません-LogisticRegression l1 l2ペナルティに関する私のブログ投稿を参照してください)

再。過剰適合。2000項目のデータセットには、Twitterからの「apple」ツイートの10分間のスナップショットがあります。ツイートの約2/3はAppleInc向けで、1/3はその他のアップル用途向けです。各クラスのバランスの取れたサブセット(私が思うに約584行)を引き出し、トレーニングのために5分割交差検定を行います。

私は10分の時間枠しかないので、同じトピックについて多くのツイートがあります。これが、おそらく私の分類器が既存のツールと比較して非常にうまく機能する理由です-それは(既存のコマーシャルに対してツールはこのスナップショップではパフォーマンスが低下しますが、より幅広いデータセットでより確実になります)。後続の作業としてこれをテストするために、時間枠を拡大します。


私はあなたのコードを調べて複製/エミュレート/教育を試みることを楽しみにしていませんでしたが、50ポイントの報奨金をすべて授与しなかったことをお詫びします。私は週末にSOから離れていて、それを授与する期限を逃しました。ありがたいことに、SOコミュニティが参加し、25ポイントを獲得するのに適していると考えました。
ライアン

1
問題ありません:-)コード、README、ブログ投稿から、私のアプローチについてのアイデアが得られるはずです。それは意図的に単純ですが、うまくいくようです。
Ian Ozsvald 2013

12

次のことができます。

  1. 果物や会社関連のツイートでの出現回数を含む単語を口述します。これは、傾向がわかっているサンプルツイートをフィードすることで実現できます。

  2. 十分な過去のデータを使用して、アップル社に関するツイートで単語が発生する確率を見つけることができます。

  3. 単語の個々の確率を乗算して、ツイート全体の確率を取得します。

簡単な例:

p_f =フルーツのつぶやきの確率。

p_w_f =フルーツのつぶやきに出現する単語の確率。

p_t_f =ツイート内のすべての単語がフルーツツイートを発生する確率の合計= p_w1_f * p_w2_f *..。

p_f_t =特定のツイートが与えられた場合の果物の確率。

p_c、p_w_c、p_t_c、p_c_tは、会社のそれぞれの値です。

値1のラプラシアンスムーザーが追加され、データベースに存在しない新しい単語の頻度がゼロになるという問題が解消されます。

old_tweets = {'apple pie sweet potatoe cake baby https://vine.co/v/hzBaWVA3IE3': '0', ...}
known_words = {}
total_company_tweets = total_fruit_tweets =total_company_words = total_fruit_words = 0

for tweet in old_tweets:
    company = old_tweets[tweet]
    for word in tweet.lower().split(" "):
        if not word in known_words:
            known_words[word] = {"company":0, "fruit":0 }
        if company == "1":
            known_words[word]["company"] += 1
            total_company_words += 1
        else:
            known_words[word]["fruit"] += 1
            total_fruit_words += 1

    if company == "1":
        total_company_tweets += 1
    else:
        total_fruit_tweets += 1
total_tweets = len(old_tweets)

def predict_tweet(new_tweet,K=1):
    p_f = (total_fruit_tweets+K)/(total_tweets+K*2)
    p_c = (total_company_tweets+K)/(total_tweets+K*2)
    new_words = new_tweet.lower().split(" ")

    p_t_f = p_t_c = 1
    for word in new_words:
        try:
            wordFound = known_words[word]
        except KeyError:
            wordFound = {'fruit':0,'company':0}
        p_w_f = (wordFound['fruit']+K)/(total_fruit_words+K*(len(known_words)))
        p_w_c = (wordFound['company']+K)/(total_company_words+K*(len(known_words)))
    p_t_f *= p_w_f
    p_t_c *= p_w_c

    #Applying bayes rule
    p_f_t = p_f * p_t_f/(p_t_f*p_f + p_t_c*p_c)
    p_c_t = p_c * p_t_c/(p_t_f*p_f + p_t_c*p_c)
    if p_c_t > p_f_t:
        return "Company"
    return "Fruit"

9

外部ライブラリの使用に問題がない場合は、scikit-learnをお勧めします。これは、自分でコーディングできるものよりも優れた速度で実行できる可能性があるためです。私はこのようなことをするだけです:

コーパスを作成します。わかりやすくするためにリスト内包表記を行いましたが、データの保存方法によっては、さまざまなことを行う必要がある場合があります。

def corpus_builder(apple_inc_tweets, apple_fruit_tweets):
    corpus = [tweet for tweet in apple_inc_tweets] + [tweet for tweet in apple_fruit_tweets]
    labels = [1 for x in xrange(len(apple_inc_tweets))] + [0 for x in xrange(len(apple_fruit_tweets))]
    return (corpus, labels)

重要なことは、次のような2つのリストが作成されることです。

([['apple inc tweet i love ios and iphones'], ['apple iphones are great'], ['apple fruit tweet i love pie'], ['apple pie is great']], [1, 1, 0, 0])

[1、1、0、0]は、正と負のラベルを表します。

次に、パイプラインを作成します。Pipelineはscikit-learnクラスであり、テキスト処理ステップを簡単に連鎖させることができるため、トレーニング/予測時に1つのオブジェクトを呼び出すだけで済みます。

def train(corpus, labels)
    pipe = Pipeline([('vect', CountVectorizer(ngram_range=(1, 3), stop_words='english')),
                        ('tfidf', TfidfTransformer(norm='l2')),
                        ('clf', LinearSVC()),])
    pipe.fit_transform(corpus, labels)
    return pipe

パイプライン内には、3つの処理ステップがあります。CountVectorizerは、単語をトークン化し、分割し、カウントし、データをスパース行列に変換します。TfidfTransformerはオプションであり、精度の評価に応じて削除することをお勧めします(相互検証テストと最適なパラメーターのグリッド検索を行うのは少し複雑なので、ここでは説明しません)。LinearSVCは、標準のテキスト分類アルゴリズムです。

最後に、ツイートのカテゴリを予測します。

def predict(pipe, tweet):
    prediction = pipe.predict([tweet])
    return prediction

繰り返しになりますが、ツイートはリストに含める必要があるため、関数を文字列として入力していると想定しました。

それらすべてをクラスなどに入れれば、完了です。少なくとも、この非常に基本的な例では。

私はこのコードをテストしなかったので、コピーして貼り付けるだけでは機能しない可能性がありますが、scikit-learnを使用する場合は、どこから始めればよいかがわかります。

編集:手順をより詳細に説明しようとしました。


6

決定木を使用すると、この問題に対して非常にうまく機能するようです。少なくとも、選択した機能を備えた単純ベイズ分類器よりも高い精度が得られます。

いくつかの可能性を試してみたい場合は、次のコードを使用できます。これには、nltkをインストールする必要があります。nltkの本はオンラインでも無料で入手できるので、これらすべてが実際にどのように機能するかについて少し読んでみてください:http//nltk.googlecode.com/svn/trunk/doc/book/ch06.html

#coding: utf-8
import nltk
import random
import re

def get_split_sets():
    structured_dataset = get_dataset()
    train_set = set(random.sample(structured_dataset, int(len(structured_dataset) * 0.7)))
    test_set = [x for x in structured_dataset if x not in train_set]

    train_set = [(tweet_features(x[1]), x[0]) for x in train_set]
    test_set = [(tweet_features(x[1]), x[0]) for x in test_set]
    return (train_set, test_set)

def check_accurracy(times=5):
    s = 0
    for _ in xrange(times):
        train_set, test_set = get_split_sets()
        c = nltk.classify.DecisionTreeClassifier.train(train_set)
        # Uncomment to use a naive bayes classifier instead
        #c = nltk.classify.NaiveBayesClassifier.train(train_set)
        s += nltk.classify.accuracy(c, test_set)

    return s / times


def remove_urls(tweet):
    tweet = re.sub(r'http:\/\/[^ ]+', "", tweet)
    tweet = re.sub(r'pic.twitter.com/[^ ]+', "", tweet)
    return tweet

def tweet_features(tweet):
    words = [x for x in nltk.tokenize.wordpunct_tokenize(remove_urls(tweet.lower())) if x.isalpha()]
    features = dict()
    for bigram in nltk.bigrams(words):
        features["hasBigram(%s)" % ",".join(bigram)] = True
    for trigram in nltk.trigrams(words):
        features["hasTrigram(%s)" % ",".join(trigram)] = True  
    return features

def get_dataset():
    dataset = """copy dataset in here
"""
    structured_dataset = [('fruit' if x[0] == '0' else 'company', x[2:]) for x in dataset.splitlines()]
    return structured_dataset

if __name__ == '__main__':
    print check_accurracy()

1
これはどのように作動しますか?コードに「選択した機能」が表示されません。トレーニングセットに基づいて機能を自動的に選択しますか?それともdict()どこかに保存されていますか?自分のトレーニングセットが十分に大きい場合、コンピューターは機能自体を理解できるべきではないと思いますか?(教師なし?)
ライアン

2
特徴は、tweet_features関数を使用して抽出されます。基本的にツイートからURLを削除し、エントリが「hasBigram(foo、bar)」= Trueのようなものを読み取る機能辞書を作成します。
Paul Dubs 2013

1
では'hasBigram(foo,bar)' = True、ツイート文字列にはfoo barどこに含まれていますか?それで、ツイートごとにバイグラムとトリグラムを作成し、ポジティブ機能でフラグを立てますdict()か?したがって、ツイートが与えられると"alpha beta gamma delta"、とのdict()バイグラムalpha,beta; beta,gamma; and gamma,delta;とトリグラムが作成さalpha,beta,gammabeta,gamma,deltaます。そして、与えられた正と負のバイグラムとトライグラムから、決定木またはベイズ分類器は魔法をかけることができますか?
ライアン

2
丁度。ベイズ分類器を使用する場合は、「show_most_informative_features()」を呼び出すことで最も便利な機能を取得することもできます。
Paul Dubs 2013

ポール、私はこれの大まかなphpバージョンを作成しました、そしてあなたは絶対に正しいです。これは、加重辞書を作成するための非常に効率的な方法です。これは、すべてのキーワードを手動で作成しなくても簡単に拡張できると思います。標準の機械学習ライブラリ内でこれを行う方法についてさらに学ぶことを楽しみにしています。
ライアン

5

これまでのコメントありがとうございます。これが私がPHPで準備した実用的なソリューションです。私はまだ他の人からこの同じ解決策へのよりアルゴリズム的なアプローチを聞くことに興味があります。

<?php

// Confusion Matrix Init
$tp = 0;
$fp = 0;
$fn = 0;
$tn = 0;
$arrFP = array();
$arrFN = array();

// Load All Tweets to string
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://pastebin.com/raw.php?i=m6pP8ctM');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$strCorpus = curl_exec($ch);
curl_close($ch);

// Load Tweets as Array
$arrCorpus = explode("\n", $strCorpus);
foreach ($arrCorpus as $k => $v) {
    // init
    $blnActualClass = substr($v,0,1);
    $strTweet = trim(substr($v,2));

    // Score Tweet
    $intScore = score($strTweet);

    // Build Confusion Matrix and Log False Positives & Negatives for Review
    if ($intScore > 0) {
        if ($blnActualClass == 1) {
            // True Positive
            $tp++;
        } else {
            // False Positive
            $fp++;
            $arrFP[] = $strTweet;
        }
    } else {
        if ($blnActualClass == 1) {
            // False Negative
            $fn++;
            $arrFN[] = $strTweet;
        } else {
            // True Negative
            $tn++;
        }
    }
}

// Confusion Matrix and Logging
echo "
           Predicted
            1     0
Actual 1   $tp     $fp
Actual 0    $fn    $tn

";

if (count($arrFP) > 0) {
    echo "\n\nFalse Positives\n";
    foreach ($arrFP as $strTweet) {
        echo "$strTweet\n";
    }
}

if (count($arrFN) > 0) {
    echo "\n\nFalse Negatives\n";
    foreach ($arrFN as $strTweet) {
        echo "$strTweet\n";
    }
}

function LoadDictionaryArray() {
    $strDictionary = <<<EOD
10|iTunes
10|ios 7
10|ios7
10|iPhone
10|apple inc
10|apple corp
10|apple.com
10|MacBook
10|desk top
10|desktop
1|config
1|facebook
1|snapchat
1|intel
1|investor
1|news
1|labs
1|gadget
1|apple store
1|microsoft
1|android
1|bonds
1|Corp.tax
1|macs
-1|pie
-1|clientes
-1|green apple
-1|banana
-10|apple pie
EOD;

    $arrDictionary = explode("\n", $strDictionary);
    foreach ($arrDictionary as $k => $v) {
        $arr = explode('|', $v);
        $arrDictionary[$k] = array('value' => $arr[0], 'term' => strtolower(trim($arr[1])));
    }
    return $arrDictionary;
}

function score($str) {
    $str = strtolower($str);
    $intScore = 0;
    foreach (LoadDictionaryArray() as $arrDictionaryItem) {
        if (strpos($str,$arrDictionaryItem['term']) !== false) {
            $intScore += $arrDictionaryItem['value'];
        }
    }
    return $intScore;
}
?>

上記の出力:

           Predicted
            1     0
Actual 1   31     1
Actual 0    1    17


False Positives
1|Royals apple #ASGame @mlb @ News Corp Building http://instagram.com/p/bBzzgMrrIV/


False Negatives
-1|RT @MaxFreixenet: Apple no tiene clientes. Tiene FANS// error.... PAGAS por productos y apps, ergo: ERES CLIENTE.

4

あなたが与えたすべての例では、アップル(INC)は、どちらかと呼ばれていましたppleやリンゴINC可能な方法が検索することができるよう、:

  • Appleの大文字の「A」

  • リンゴの後の「inc」

  • 「OS」、「オペレーティングシステム」、「Mac」、「iPhone」などの単語/フレーズ...

  • またはそれらの組み合わせ


1
関数では、大文字を除外するためにstrtolowerを実行しました。少し粗雑ですが、うまくいきました。
SAL 2013

@SALあまり役立つとは思っていませんでしたが、時間制限がある場合は...
user2425429 2013

4

条件付き確率場に基づいて答えを少し単純化するために...ここではコンテキストが巨大です。あなたはそれらのつぶやきの中から、Appleに会社とAppleの実をはっきりと示しているものを選びたいと思うでしょう。ここで、最初に役立つと思われる機能のリストを概説します。詳細については、名詞句のチャンクとBIOラベルと呼ばれるものを調べてください。(http://www.cis.upenn.edu/~pereira/papers/crf.pdf)を参照してください。

周囲の単語:前の単語と次の単語の特徴ベクトルを作成します。さらに多くの特徴が必要な場合は、前の2単語と次の2単語を作成します。モデル内の単語が多すぎないようにする必要があります。そうしないと、データとの一致が不十分になります。自然言語処理では、これをできるだけ一般的にしたいと思うでしょう。

周囲の単語から取得するその他の機能は次のとおりです。

最初の文字が大文字かどうか

単語の最後の文字がピリオドかどうか

単語の品詞(品詞タグ付け)

単語のテキスト自体

私はこれをお勧めしませんが、Apple専用の機能の例をもっと挙げます。

WordIs(Apple)

NextWordIs(Inc。)

あなたはポイントを取得します。固有表現抽出は、シーケンスを記述し、数学を使用してコンピューターにその計算方法を指示するものと考えてください。

自然言語処理はパイプラインベースのシステムであることに注意してください。通常、物事を文に分割し、トークン化に移行してから、品詞タグ付けまたは依存関係の解析を行います。

これで、モデルで使用できる機能のリストを取得して、探しているものを特定できます。


3

自然言語テキスト処理のための本当に良いライブラリがありますパイソンと呼ばれるがnltk。あなたはそれを見てみるべきです。

試すことができる戦略の1つは、「apple」という単語が含まれているn-gram(単語のグループ)を調べることです。果物について話すときは「リンゴ」の横に使用される可能性が高い単語もあれば、会社について話すときに使用される単語もあり、それらを使用してツイートを分類できます。


1
Manetheranに感謝します。私はオリジナルのポスターではありませんが、答えにも興味があります。恵みのためにnltk、「Hello World」の機械学習タスクを正しい方向に進めるのに役立つコードを(使用していても)探しています。アップル(inc)対アップル(フルーツ)は完璧な割り当てのようです。
ライアン

3

LibShortTextを使用します。このPythonユーティリティは、短いテキスト分類タスクで機能するようにすでに調整されており、うまく機能します。あなたがしなければならない最大のことは、フラグの最良の組み合わせを選ぶためのループを書くことです。私はこれを使用して、電子メールで教師あり発話行為の分類を行いました。結果は最大95〜97%正確でした(5分割交差検証中!)。

また、サポートベクターマシン(SVM)の実装がsklearnとcranで使用されているLIBSVMLIBLINEARのメーカーから提供されているため、実装にバグがないことを合理的に確信できます。


2

区別するために、AIフィルタを作成し、アップル社から(会社を)りんご(果実)。これらはツイートであるため、140フィールドのベクトルを使用してトレーニングセットを定義します。各フィールドは、ツイートの位置X(0〜139)に書き込まれる文字です。ツイートが短い場合は、空白の値を指定してください。

次に、十分な精度を得るのに十分な大きさのトレーニングセットを作成します(好みに応じて)。各ツイートに結果値を割り当てると、Apple Incのツイートは1(true)になり、Appleのツイート(fruit)は0になります。これは、ロジスティック回帰での教師あり学習の場合です。

これは機械学習であり、一般的にコーディングが簡単で、パフォーマンスも向上します。それはあなたがそれを与えるセットから学ぶ必要があり、それはハードコーディングされていません。

私はPythonを知らないので、そのコードを書くことはできませんが、機械学習のロジックと理論にもっと時間がかかる場合は、私がフォローしているクラスを調べたいと思うかもしれません。

試してみてくださいコーセラのコース機械学習をすることによってアンドリュー・ウMATLABまたはOctaveで機械学習を学習しますでますが、基本を習得すると、単純な数学(ロジスティック回帰で単純)を理解していれば、ほぼすべての言語で機械学習を記述できるようになります。

つまり、誰かからコードを取得しても、機械学習コードで何が起こっているのかを理解することはできません。実際に何が起こっているのかを確認するために、このテーマに数時間を投資することをお勧めします。


Fawarに感謝します。MLがどのように機能するかを学ぶために、この「HelloWorld」にこの正確な目的のためのコードが必要でした。でもクラスを調べます。いいね。
ライアン

0

エンティティの認識を示唆する回答は避けることをお勧めします。このタスクは最初にテキスト分類であり、次にエンティティ認識であるためです(エンティティ認識なしで実行できます)。

結果への最速の道はスペイシー+プロディジーだと思います。Spacyは英語のモデルをよく考えているので、自分で作成する必要はありません。Prodigyを使用すると、トレーニングデータセットをすばやく作成し、ニーズに合わせてSpacyモデルを微調整できます。

十分なサンプルがあれば、1日でまともなモデルを持つことができます。


同時に、spaCy持っているnerパイプラインコンポーネントを、それがこの分類のために有益ではないでしょうか?彼らのモデルはApple(世界で最大かつ最も有名な企業の1つであるため)、1日で思いつくモデルよりもはるかによく認識できると思います。
SzymonMaszke19年

@Szymon:NERが役立つ場合と役に立たない場合があります。私が理解しているように、名前付きエンティティ(テキストに存在するという事実)をメインの分類タスクの機能として使用する必要があります。明らかに、あいまいさのレベルが高いため、NERの精度は100%ではありません。したがって、主要な分類モデルは、どのような状況でこの機能を信頼するかを決定します。基本的な分類モデルは、NERモデルの結果に非常に低い重みを与えることが判明する可能性があります(非常に可能性が高いと思います)。そしてこれは、(ほとんど)使用されていないNERに時間を費やすことを意味します。
薄暗い

私が意図したことではありません。spacy.Doc各テキストから作成しdoc.ents、でNERを繰り返し処理し、いずれかのNERの.text属性がApple。に等しいかどうかを確認します。面白いことに、彼らの最初の例はAppleで構成されています。
SzymonMaszke19年

そして、誰かがモデルを作りたいと思ったら、おそらくRNN / CNNなどが関係し、それに応じてそれらを調整し、アーキテクチャ、セルタイプなどを見つけます。簡単なモデルでは、曖昧さの解消とコンテキストをうまく処理できるとは思いません。誰かがすでにあなたのためにそれをしているのなら、なぜあなたの人生を楽にするのですか(あなたが途中で何かを学びたいのでなければ)?
SzymonMaszke19年

@SzymonMaszkeモデルはより複雑で、トレーニングがより困難です。モデルが上記の目的で機能するためには、NEを見つけるだけでなく、正しい場所(トークン)でそれを見つける必要があります。私が提案する分類モデルを使用して、コア目標に合わせてモデルを最適化することをお勧めします-それがアップル社またはアップルフルーツであることを識別します。トレーニングが簡単なので、おそらくより正確になります。
薄暗い
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.