1

私が心に留めていることを説明しようとします。

MS SQL データベースに保存されているテキスト コンテンツがあります。コンテンツはストリームとして毎日配信されます。毎日コンテンツを確認し、コンテンツが特定の基準に適合する場合は、検証済みとしてマークする人もいます。カテゴリは 1 つだけです。それは「有効」かどうかです。

私が望むのは、既に検証されたコンテンツに基づいてモデルを作成し、それを保存し、このモデルを使用して「事前検証」または新しい受信コンテンツをマークすることです。また、新しく検証されたコンテンツに基づいてモデルを更新することもあります。うまくいけば、私は自分自身を明確に説明しました。

作成したモデルに基づくデータ分類に Spark ストリーミングを使用することを考えています。そしてナイーブベイズアルゴリズム。しかし、モデルの作成、更新、保存にどのようにアプローチしますか? さまざまな長さの 200K 以上の検証済み結果 (テキスト) があります。モデルにはそんなにたくさん必要ですか?そして、Spark Streaming でこのモデルを使用する方法。

前もって感謝します。

4

1 に答える 1

2

うわー、この質問は非常に広範で、よりも関連してMachine LearningApache Sparkますが、従うべきヒントや手順をいくつか提供しようとします (私はあなたのために仕事をしません)。

  1. 必要なすべてのライブラリをインポートします

    from pyspark.mllib.classification import LogisticRegressionWithSGD, LogisticRegressionModel
    from pyspark.mllib.linalg import SparseVector
    from pyspark.mllib.regression import LabeledPoint
    import re
    
  2. データをRDDにロードする

    msgs = [("I love Star Wars but I can't watch it today", 1.0),
            ("I don't love Star Wars and people want to watch it today", 0.0),
            ("I dislike not being able to watch Star Wars", 1.0),
            ("People who love Star Wars are my friends", 1.0),
            ("I preffer to watch Star Wars on Netflix", 0.0),
            ("George Lucas shouldn't have sold the franchise", 1.0),
            ("Disney makes better movies than everyone else", 0.0)]
    
    rdd = sc.parallelize(msgs)
    
  3. データをトークン化します ( MLを使用する場合は、より簡単になる可能性があります)。

    rdd = rdd.map(lambda (text, label): ([w.lower() for w in re.split(" +", text)], label))
    
  4. 不要な単語 (ストップ ワードとして広く知られている) と記号をすべて削除します。,.&

    commons = ["and", "but", "to"]
    rdd = rdd.map(lambda (tokens, label): (filter(lambda token: token not in commons, tokens), label))
    
  5. すべてのデータセットdistinct内のすべての単語を含む辞書を作成します。巨大に聞こえますが、期待するほど多くはありません。マスターノードに収まるはずです (ただし、これにアプローチする方法は他にもありますが、簡単にするためにここではこのままにしてください)。

    # finds different words
    words = rdd.flatMap(lambda (tokens, label): tokens).distinct().collect()
    diffwords = len(words)
    
  6. あなたfeaturesDenseVectorまたはSparseVectorに変換します。通常、 a を表すのに必要なスペースが少なくて済むため、明らかに 2 番目の方法をお勧めしSparseVectorますが、それはデータに依存します。のようなより良い代替手段があることに注意してくださいhashing。その後、をLabeledPointtupleに変換します

    def sparsify(length, tokens):
        indices = [words.index(t) for t in set(tokens)]
        quantities = [tokens.count(words[i]) for i in indices]
    
        return SparseVector(length, [(indices[i], quantities[i]) for i in xrange(len(indices))])
    
    rdd = rdd.map(lambda (tokens, label): LabeledPoint(label, sparsify(diffwords, tokens)))
    
  7. お気に入りのモデルに合わせてください。この場合、下心のためにLogisticRegressionWithSGDを使用しました。

    lrm = LogisticRegressionWithSGD.train(rdd)
    
  8. モデルを保存します。

    lrm.save(sc, "mylovelymodel.model")
    
  9. LogisticRegressionModelを別のアプリケーションにロードします。

    lrm = LogisticRegressionModel.load(sc, "mylovelymodel.model")
    
  10. カテゴリを予測します。

    lrm.predict(SparseVector(37,[2,4,5,13,15,19,23,26,27,29],[1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0]))
    # outputs 0
    

accuracyモデルの評価はしていないことに注意してください。

于 2015-12-18T01:52:44.190 に答える