2

私は、テキスト分類のためのscikit-learn教師あり学習法を使用しています。私は入力テキストフィールドとそれが属するカテゴリを持つトレーニングデータセットを持っています。私はtf-idf、SVMクラシファイアパイプラインを使ってモデルを作成します。このソリューションは、通常のテストケースでうまく機能します。しかし、訓練セットのように似たような言葉を持つ新しいテキストが入力された場合、その解決法は正しく分類されない。 例:トレーニングデータに「実行」という単語が含まれていることがありますが、「スプリント」という単語を使用してテストすると、ソリューションは正しく分類されません。テキスト分類のための教師あり学習における同義語のアドレス指定

ここで最善のアプローチは何ですか?トレーニングデータセット内のすべての単語のすべての同義語を追加することは、スケーラブルなアプローチではありません。

+0

があなたの代わりにコンテキストをキャッチしようとする単語の袋を使用しようとしましたか? – MMF

答えて

3

単語ベクトルと密なドキュメントの埋め込みを調べる必要があります。今すぐscikitを渡しています。行列Xを学びます。ここで、各行は、データセット内のドキュメントの数値表現です。あなたはtf-idfでこの表現を得ていますが、これは単語の類似性を捕捉していないことに気付きました。また、あなたはボキャブラリーの言葉で問題を抱えています。

可能な改善点は、類似の意味を持つ単語がこの300次元空間に近いような方法で、次元300と言う密なベクトルで各単語を表現することです。幸いにも、これらのベクタを最初から構築する必要はありません(gensim word2vecとspacyを参照してください)。もう一つの良いことは、Wikipediaのような非常に大きなコーパスに事前に訓練された単語埋め込みを使用することによって、あなたのコーパスから推測できなかったアルゴリズムに関する世界の言語情報をたくさん組み込んでいることです(sprintやrun同義語です)。

単語の意味的数値表現が得られたら、各文書のベクトル表現を取得する必要があります。最も簡単な方法は、文中の各単語の単語ベクトルを平均化することです。

例の擬似コードは、作業を開始します場合でも、単語をベクトルが類似しているか

>>> doc2 = nlp('I had a great sprint') 
>>> doc2.vector 
array([ 0.02453461, -0.00261007, 0.01455955, -0.01595449, -0.01795897, 
    -0.02184369, -0.01654281, 0.01735667, 0.00054854, ... 

>>> doc2.similarity(doc1) 
0.8820845113100807 

注意(コサイン類似度の意味での):

>>> import spacy 

>>> nlp = spacy.load('en') 
>>> doc1 = nlp('I had a good run') 
>>> doc1.vector 
array([ 6.17495403e-02, 2.07064897e-02, -1.56451517e-03, 
     1.02607915e-02, -1.30429687e-02, 1.60102192e-02, ... 

は今別のドキュメントを試すことができます異なっています。ベクトルは類似しているので、scikit-learnクラシファイアは同じカテゴリにそれらを割り当てることを学びます。 tf-idf表現では、これは当てはまりません。

これは、あなたがこれらのベクターを使用する方法であるscikit学習:

X = [nlp(text).vector for text in corpus] 
clf.fit(X, y) 
+0

私はあなたの提案を試み、結果を再現できました。しかし、私が「私は素晴らしい飲み物を持っていました」とテストしたところ、0.88という高い類似性を私に与えました。それから、私はrunとsprintの間の類似点をテストしたところ、私は0.49を得ました。より良いパフォーマンスを得るためにあなたの提案に何か改善があるかどうかをお聞かせください。おかげで – Shamy

+0

あなたが気づいたように、NLPはまだ解決されていない問題であり、完璧に動作することはありません。 tf-idfを使うと、sprintとrunの間の類似度は0になり、これはさらに悪化するため、まだ単語ベクトルが改善されています。あなたはブラウンのクラスタ、同義語を扱うsynsetを試すことができますが、ほとんどのSOTAシステムでは単語ベクトルが使用されています。これは始まりにすぎず、より良いvecs、より良いフレーズ担当者などを得るように改善できる多くのことがありますが、コメントのための多くの情報であるため、新しい質問をすることをお勧めします。 – elyase

+0

ありがとうございました@elyase新しい質問を投稿しました。あなたはそれに答えることができますか? – Shamy

関連する問題