web-dev-qa-db-ja.com

機械学習による非常に単純なテキスト分類?

重複の可能性:
カテゴリへのテキスト分類

私は現在、1万件のレストランの説明に基づいて、データベースで提供される食品の種類を取得するためのソリューションに取り組んでいます。キーワードリストを使用して、どの種類の料理を提供するかを決定しています。

機械学習について少し読みましたが、実際の経験はまったくありません。このような単純な問題のより良い解決策であるかどうか、またはなぜ私に説明できますか?パフォーマンスよりも正確さが重要だと思います!

簡単な例:

["China", "Chinese", "Rice", "Noodles", "Soybeans"]
["Belgium", "Belgian", "Fries", "Waffles", "Waterzooi"]

可能な説明は次のとおりです。

「Hong's Garden Restaurantでは、リーズナブルな中華料理をお客様に提供しています。に突然の渇望がある場合は、 noodlesまたはsoybeans土曜日の夜8時、心配しないでください!週7日営業しています持ち帰りサービスを提供しています。ここでもフライを入手できます!」

15
Dieter

確かに、機械学習で解決できるclassification問題を記述しています。

この問題では、あなたの特徴は説明の中の言葉です。 Bag Of Words モデルを使用する必要があります-これは基本的に、各単語の単語とその出現回数が何であるかを示しています分類プロセスの問題。

問題を解決するために、次の手順を実行してください:

  1. 特徴抽出器を作成します-レストランの説明を指定すると、このレストランの「特徴」(上記で説明したBag Of Wordsモデルの下)を返します(文献では例として示されています)。
  2. 手動で一連の例にラベルを付けます、それぞれに目的のクラス(中華料理、ベルギー料理、ジャンクフードなど)のラベルを付けます。
  3. ラベル付きの例を学習アルゴリズムにフィードします。 分類子を生成します。個人的な経験から、通常 [〜#〜] svm [〜#〜] が最良の結果をもたらしますが、 Naive BayesNeuralネットワーク および Decision Trees (通常は C4.5 が使用されます)、それぞれに独自の利点があります。
  4. 新しい(ラベルのない)例(レストラン)が来たとき-機能を抽出し、それを分類子にフィードします-それはそれが何であるかを伝えます(そして通常-分類子が正しい確率はどれくらいですか)。

評価:
アルゴリズムの評価は cross-validation を使用するか、アルゴリズムの精度を評価するためにのみ使用されるラベル付きの例からテストセットを分離することができます。


最適化:

個人的な経験から-ここに私が特徴抽出に役立ついくつかの最適化があります:

  1. ステミングストップワード を削除すると、通常は非常に役立ちます。
  2. Bi-Grams を使用すると、精度が向上する傾向があります(機能空間が大幅に増加します)。
  3. 一部の分類子は、特徴空間が大きくなる傾向があります(SVMは含まれません)。特徴の次元数を減らすなど、それを克服する方法がいくつかあります。 [〜#〜] pca [〜#〜] は、それを支援する1つの方法です。 Genethic Algorithms もサブセットの選択には(経験的に)かなり優れています。

ライブラリ:

残念ながら、私はpythonに堪能ではありませんが、役立つ可能性があるいくつかのライブラリを以下に示します。

  • Lucene は、テキスト分析などに役立ちます。たとえば、ステミングは EnglishAnalyzer で実行できます。 pythonルセンのバージョン PyLucene と呼ばれるバージョンがあり、それがあなたを助けるかもしれないと私は信じています。
  • Weka は、機械学習に役立つ多くの機能を実装するオープンソースライブラリです-多くの分類子と機能セレクターが含まれています。
  • Libsvm は、SVMアルゴリズムを実装するライブラリです。
57
amit