Javaでニュヌラルネットワヌクを持぀テキスト分類

- 私たちのレナは、産䌑に入る - é ­ - 私たちは圌女の䞍圚期間䞭の代替を芋぀ける必芁があるので。 ナヌザヌ芁求をリダむレクトする䜜業に぀いお、我々は、配垃タスクが、䜕の䞀郚



レナ-スタッフのサポヌトのメンバヌ。 職務の䞀぀-専門家の間で電子メヌルぞの着信呌の分垃。 それは魅力を分析し、特性の数を決定したす。 たずえば、「アクセスタむプ」システム゚ラヌ、単に利甚者に盞談する必芁があるナヌザヌは、いく぀かの新しい機胜を望んでいたす。 定矩「システムの機胜モゞュヌル」䌚蚈モゞュヌル、機噚の認蚌など これらの特性のすべおを確認するには、適切な治療にリダむレクトしたす。



- 私はそれを自動的に行いたすプログラムを曞くよ、さあ - 私は答えたした。



技術的な郚分ぞのこの魅惑的な小説、フィニッシュムヌブで。









タスクを圢匏





私たちの特定のニヌズに合わせおタスクず開発の開始を定匏化、私はすぐに厳密にいく぀かの特定の特性及びこれらの特性の数に瞛られる汎甚性の高いツヌルを開発した方がよいこずに気づきたした。 結果は、任意の特性のテキストを分類するこずができツヌルでした。



それを自分で行うには、時間ず関心だったので、準備完了゜リュヌションは、求めおいなかった、パラレルはニュヌラルネットワヌクの研究に浞挬したした。



楜噚の遞択



私は、Javaで開発するこずを決めたした。



䜿甚しおデヌタベヌスずしおSQLiteのずH2を 。 それはたたに䟿利です䌑止状態 。



したがっお、それは、ニュヌラルネットワヌクEncog機械孊習フレヌムワヌクの準備ができお実装したした。 私は、分類噚、ニュヌラルネットワヌクではなく、䟋えば、ずしおそれを䜿甚するこずを決めた単玔ベむズ分類噚たず、理論的には、ニュヌラルネットワヌクが正確でなければなら、ので、。 第二に、私は、ニュヌラルネットワヌクをいじっおみたかったです。



いく぀かのラむブラリ蚓緎するために必芁なデヌタのExcelファむル読み蟌みするにはApache POIを 。



ああ、そしお䌝統的に䜿甚テストのためのJUnit 4 + Mockito 。



少し理論



それは十分なので、私は、詳现にニュヌラルネットワヌクの理論を説明しおいないだろう、ここでは良い入門資料。 簡単に蚀うず、単玔な方法でネットワヌクは、入力局、䞭間局および出力局を有しおいたす。 それぞれの局のニュヌロンの数は、予め開発者によっお決定され、远加した堎合の孊習ネットワヌクを倉曎するこずはできたせん/埌、再び再蚓緎するネットワヌクの必芁性が単䞀ニュヌロンを䜎䞋させたした。 入力局の各ニュヌロンに察する正芏化数は、ほずんどの堎合、0から1たでが適甚されたす。 入力局における敎数の集合に応じお、各出力ニュヌロン䞊のいく぀かの蚈算埌も0から1たでの数を埗おいたす。









孊習ネットワヌクの本質は、ネットワヌクが、蚈算に関䞎するリンクの重みを調敎するこずであるので、入力局における䞀定の予め蚭定された数倀が出力局に予め数字の既知のセットを受信するずき。 バランスの調敎 - それは反埩の䞀定数に達するたで、ネットワヌクのいずれか蚓緎セット䞊の所定の粟床に達するたで反埩プロセスが発生したす。 蚓緎の埌、入力がトレヌニングセットにしたものず類䌌の数の集合を、提出された堎合、ネットワヌクは、出力局の数字の暙準セットに近いを発行するこずが期埅されたす。



私たちは緎習に向けたす



最初のタスクは、ニュヌラルネットワヌクの入力に枡すこずができる圢匏にテキストを倉換する方法を芋぀け出すこずでした。 しかし、最初に、事前に蚭定する必芁があるように、ネットワヌクの入力局のサむズを決定する必芁がありたした。 入力局は、この局であったこずができたす任意のテキストにサむズ決めなければならないこずは明癜である「フィット。」 心に来る最初の事- 入力局の倧きさは、コンテキストその蚀葉/フレヌズを含む蟞曞のサむズず同じでなければなりたせん 。



語圙を構築するための倚くの方法。 䟋えば、我々は愚かなロシア語のすべおの単語を取り、それが私たちの語圙になりたす。 入力局の倧きさは、ニュヌラルネットワヌクが十分なリ゜ヌスを持っおいないシンプルなワヌクステヌションを䜜成するこずをずおも巚倧になりたすので、しかし、このアプロヌチは、適切ではありたせん。 たずえば、私たちは蟞曞は100個の000の単語を持っおいるこずを想像し、その埌、我々は、入力局100,000ニュヌロンを持っおいたす。 䟋えば、隠れ局䞭間局の寞法を決定するための以䞋に蚘茉される方法、出力25で80000。 次いでだけ接続の重みを栌玍するためのRAM〜60ギガバむト100 * 000 80 000+000 * 80 25* 64ビットJAVAでdouble型を必芁ずするであろう。 特定の甚語がテキストではなく、蟞曞に䜿甚するこずができるので、第二に、このアプロヌチは、適切ではありたせん。



したがっお、蟞曞は唯䞀の私たちの分析されたテキストを構成するそれらの単語/フレヌズを構築すべきずの結論。 トレヌニングデヌタの十分に倧きい量であるべきである。この堎合には蟞曞を構築するこずを理解するこずが重芁です 。



テキストの蚀葉/フレヌズを「匕き出す」の䞀぀の方法もっず正確には、フラグメントがの建蚭ず呌ばNグラム 。 最も人気のあるunigrammyずバむグラムです。 文字Nグラムもありたす - テキストは、特定の長さのセグメントに個々の単語や文字の䞊にないずきに抌し朰されたす。 それはあなたが実隓する必芁があるので、特定のタスクに有効になりたすNグラムのどの蚀うのは難しいです。

テキスト Unigramma バむグラム 3文字Nグラム
このテキストは郚分に分割する必芁がありたす [ "この"、 "テキスト"、 "である" "べきである"、 "に"、 "壊れた"、 "郚"] [「に分割」「この文章」、「テキストがなければならない」、「砎壊する」「べき」、「離れお」] [ "この"、 "TT"、 "CEN"、 "等"、 "olzh"、 "EN"、 "生呜"、 "S P"、 "AZB"、 "UM"、 "侊"、「H "" 分「]


私は単玔なものから耇雑なものたで移動するこずを決めたずナニグラムクラスを開始するように蚭蚈されおいたす。



クラスナニグラム
class Unigram implements NGramStrategy { @Override public Set<String> getNGram(String text) { if (text == null) { text = ""; } // get all words and digits String[] words = text.toLowerCase().split("[ \\pP\n\t\r$+<>№=]"); Set<String> uniqueValues = new LinkedHashSet<>(Arrays.asList(words)); uniqueValues.removeIf(s -> s.equals("")); return uniqueValues; } }
      
      







その結果、〜䞇のテキストを凊理した埌、私は〜32,000芁玠の蟞曞サむズを埗たした。 その結果、察角蟞曞を分析した埌、私はを取り陀くために持っおいるだろうかず、非垞に倚くの繰り返しがあるこずに気づきたした。 これを行うには



  1. すべおの圌らは通垞運ばないずいう意味ので、すべおの英数字以倖の文字など数字、句読点、算術挔算を、を取り倖したす。
  2. 私は、手続きの蚀葉を通じお運転ステミング 䜿甚ポヌタヌステマヌロシア語のため。 ちなみに、この手順の䟿利な副䜜甚は、「完了」された「uniseksatsiya」ずいう蚀葉、および「完了」「sdela」に倉換されたすです。
  3. 最初は私は正しいタむプミスや文法の誀りずを怜出したかったです。 オリバヌアルゎリズム関数に぀いおNachitalsja similar_text PHPでずレヌベンシュタむン距離 。 しかし、問題はしかし゚ラヌで、より簡単に解決された私は、芁玠Nグラムは、トレヌニングセットから4぀の未満のテキストを発生した堎合、我々は蟞曞で、この芁玠は将来の圹に立たないずしお含たれおいないこずを決めたした。 私はタむプミスのほずんどを凊分したので、文法的な゚ラヌが発生した蚀葉、「sleplennyhSlov」ずだけ非垞にいく぀かの単語。 しかし、我々は将来のテキストにしばしば誀怍や文法の誀りが含たれおいる堎合は、そのようなテキストの分類の粟床が䜎くなるこずを理解しお、ただタむプミスや文法の誀りを蚂正するためのメカニズムを実装しおいる必芁がありたす。 重芁単語を削陀するこずにより、めったに遭遇しないこの「トリック」ず蚀ったずきに孊習し、語圙を構築するための倧量のデヌタ。


このすべおは、教宀やFilteredUnigram VocabularyBuilderに実装されおいたす。



クラスFilteredUnigram
 public class FilteredUnigram implements NGramStrategy { @Override public Set<String> getNGram(String text) { // get all significant words String[] words = clean(text).split("[ \n\t\r$+<>№=]"); // remove endings of words for (int i = 0; i < words.length; i++) { words[i] = PorterStemmer.doStem(words[i]); } Set<String> uniqueValues = new LinkedHashSet<>(Arrays.asList(words)); uniqueValues.removeIf(s -> s.equals("")); return uniqueValues; } private String clean(String text) { // remove all digits and punctuation marks if (text != null) { return text.toLowerCase().replaceAll("[\\pP\\d]", " "); } else { return ""; } } }
      
      



テキスト{ public class FilteredUnigram implements NGramStrategy { @Override public Set<String> getNGram(String text) { // get all significant words String[] words = clean(text).split("[ \n\t\r$+<>№=]"); // remove endings of words for (int i = 0; i < words.length; i++) { words[i] = PorterStemmer.doStem(words[i]); } Set<String> uniqueValues = new LinkedHashSet<>(Arrays.asList(words)); uniqueValues.removeIf(s -> s.equals("")); return uniqueValues; } private String clean(String text) { // remove all digits and punctuation marks if (text != null) { return text.toLowerCase().replaceAll("[\\pP\\d]", " "); } else { return ""; } } }



.split "[\ N \トン\ R $ + <>№=]"; public class FilteredUnigram implements NGramStrategy { @Override public Set<String> getNGram(String text) { // get all significant words String[] words = clean(text).split("[ \n\t\r$+<>№=]"); // remove endings of words for (int i = 0; i < words.length; i++) { words[i] = PorterStemmer.doStem(words[i]); } Set<String> uniqueValues = new LinkedHashSet<>(Arrays.asList(words)); uniqueValues.removeIf(s -> s.equals("")); return uniqueValues; } private String clean(String text) { // remove all digits and punctuation marks if (text != null) { return text.toLowerCase().replaceAll("[\\pP\\d]", " "); } else { return ""; } } }



{ public class FilteredUnigram implements NGramStrategy { @Override public Set<String> getNGram(String text) { // get all significant words String[] words = clean(text).split("[ \n\t\r$+<>№=]"); // remove endings of words for (int i = 0; i < words.length; i++) { words[i] = PorterStemmer.doStem(words[i]); } Set<String> uniqueValues = new LinkedHashSet<>(Arrays.asList(words)); uniqueValues.removeIf(s -> s.equals("")); return uniqueValues; } private String clean(String text) { // remove all digits and punctuation marks if (text != null) { return text.toLowerCase().replaceAll("[\\pP\\d]", " "); } else { return ""; } } }



[I]。 public class FilteredUnigram implements NGramStrategy { @Override public Set<String> getNGram(String text) { // get all significant words String[] words = clean(text).split("[ \n\t\r$+<>№=]"); // remove endings of words for (int i = 0; i < words.length; i++) { words[i] = PorterStemmer.doStem(words[i]); } Set<String> uniqueValues = new LinkedHashSet<>(Arrays.asList(words)); uniqueValues.removeIf(s -> s.equals("")); return uniqueValues; } private String clean(String text) { // remove all digits and punctuation marks if (text != null) { return text.toLowerCase().replaceAll("[\\pP\\d]", " "); } else { return ""; } } }



<>は、Arrays.asListワヌド; public class FilteredUnigram implements NGramStrategy { @Override public Set<String> getNGram(String text) { // get all significant words String[] words = clean(text).split("[ \n\t\r$+<>№=]"); // remove endings of words for (int i = 0; i < words.length; i++) { words[i] = PorterStemmer.doStem(words[i]); } Set<String> uniqueValues = new LinkedHashSet<>(Arrays.asList(words)); uniqueValues.removeIf(s -> s.equals("")); return uniqueValues; } private String clean(String text) { // remove all digits and punctuation marks if (text != null) { return text.toLowerCase().replaceAll("[\\pP\\d]", " "); } else { return ""; } } }



「; public class FilteredUnigram implements NGramStrategy { @Override public Set<String> getNGram(String text) { // get all significant words String[] words = clean(text).split("[ \n\t\r$+<>№=]"); // remove endings of words for (int i = 0; i < words.length; i++) { words[i] = PorterStemmer.doStem(words[i]); } Set<String> uniqueValues = new LinkedHashSet<>(Arrays.asList(words)); uniqueValues.removeIf(s -> s.equals("")); return uniqueValues; } private String clean(String text) { // remove all digits and punctuation marks if (text != null) { return text.toLowerCase().replaceAll("[\\pP\\d]", " "); } else { return ""; } } }



[\\にpP \\ D]を"、 ""; public class FilteredUnigram implements NGramStrategy { @Override public Set<String> getNGram(String text) { // get all significant words String[] words = clean(text).split("[ \n\t\r$+<>№=]"); // remove endings of words for (int i = 0; i < words.length; i++) { words[i] = PorterStemmer.doStem(words[i]); } Set<String> uniqueValues = new LinkedHashSet<>(Arrays.asList(words)); uniqueValues.removeIf(s -> s.equals("")); return uniqueValues; } private String clean(String text) { // remove all digits and punctuation marks if (text != null) { return text.toLowerCase().replaceAll("[\\pP\\d]", " "); } else { return ""; } } }







クラスVocabularyBuilder
 class VocabularyBuilder { private final NGramStrategy nGramStrategy; VocabularyBuilder(NGramStrategy nGramStrategy) { if (nGramStrategy == null) { throw new IllegalArgumentException(); } this.nGramStrategy = nGramStrategy; } List<VocabularyWord> getVocabulary(List<ClassifiableText> classifiableTexts) { if (classifiableTexts == null || classifiableTexts.size() == 0) { throw new IllegalArgumentException(); } Map<String, Integer> uniqueValues = new HashMap<>(); List<VocabularyWord> vocabulary = new ArrayList<>(); // count frequency of use each word (converted to n-gram) from all Classifiable Texts // for (ClassifiableText classifiableText : classifiableTexts) { for (String word : nGramStrategy.getNGram(classifiableText.getText())) { if (uniqueValues.containsKey(word)) { // increase counter uniqueValues.put(word, uniqueValues.get(word) + 1); } else { // add new word uniqueValues.put(word, 1); } } } // convert uniqueValues to Vocabulary, excluding infrequent // for (Map.Entry<String, Integer> entry : uniqueValues.entrySet()) { if (entry.getValue() > 3) { vocabulary.add(new VocabularyWord(entry.getKey())); } } return vocabulary; } }
      
      



ClassifiableText> classifiableTexts{ class VocabularyBuilder { private final NGramStrategy nGramStrategy; VocabularyBuilder(NGramStrategy nGramStrategy) { if (nGramStrategy == null) { throw new IllegalArgumentException(); } this.nGramStrategy = nGramStrategy; } List<VocabularyWord> getVocabulary(List<ClassifiableText> classifiableTexts) { if (classifiableTexts == null || classifiableTexts.size() == 0) { throw new IllegalArgumentException(); } Map<String, Integer> uniqueValues = new HashMap<>(); List<VocabularyWord> vocabulary = new ArrayList<>(); // count frequency of use each word (converted to n-gram) from all Classifiable Texts // for (ClassifiableText classifiableText : classifiableTexts) { for (String word : nGramStrategy.getNGram(classifiableText.getText())) { if (uniqueValues.containsKey(word)) { // increase counter uniqueValues.put(word, uniqueValues.get(word) + 1); } else { // add new word uniqueValues.put(word, 1); } } } // convert uniqueValues to Vocabulary, excluding infrequent // for (Map.Entry<String, Integer> entry : uniqueValues.entrySet()) { if (entry.getValue() > 3) { vocabulary.add(new VocabularyWord(entry.getKey())); } } return vocabulary; } }



新しいHashMapの<>; class VocabularyBuilder { private final NGramStrategy nGramStrategy; VocabularyBuilder(NGramStrategy nGramStrategy) { if (nGramStrategy == null) { throw new IllegalArgumentException(); } this.nGramStrategy = nGramStrategy; } List<VocabularyWord> getVocabulary(List<ClassifiableText> classifiableTexts) { if (classifiableTexts == null || classifiableTexts.size() == 0) { throw new IllegalArgumentException(); } Map<String, Integer> uniqueValues = new HashMap<>(); List<VocabularyWord> vocabulary = new ArrayList<>(); // count frequency of use each word (converted to n-gram) from all Classifiable Texts // for (ClassifiableText classifiableText : classifiableTexts) { for (String word : nGramStrategy.getNGram(classifiableText.getText())) { if (uniqueValues.containsKey(word)) { // increase counter uniqueValues.put(word, uniqueValues.get(word) + 1); } else { // add new word uniqueValues.put(word, 1); } } } // convert uniqueValues to Vocabulary, excluding infrequent // for (Map.Entry<String, Integer> entry : uniqueValues.entrySet()) { if (entry.getValue() > 3) { vocabulary.add(new VocabularyWord(entry.getKey())); } } return vocabulary; } }



<>; class VocabularyBuilder { private final NGramStrategy nGramStrategy; VocabularyBuilder(NGramStrategy nGramStrategy) { if (nGramStrategy == null) { throw new IllegalArgumentException(); } this.nGramStrategy = nGramStrategy; } List<VocabularyWord> getVocabulary(List<ClassifiableText> classifiableTexts) { if (classifiableTexts == null || classifiableTexts.size() == 0) { throw new IllegalArgumentException(); } Map<String, Integer> uniqueValues = new HashMap<>(); List<VocabularyWord> vocabulary = new ArrayList<>(); // count frequency of use each word (converted to n-gram) from all Classifiable Texts // for (ClassifiableText classifiableText : classifiableTexts) { for (String word : nGramStrategy.getNGram(classifiableText.getText())) { if (uniqueValues.containsKey(word)) { // increase counter uniqueValues.put(word, uniqueValues.get(word) + 1); } else { // add new word uniqueValues.put(word, 1); } } } // convert uniqueValues to Vocabulary, excluding infrequent // for (Map.Entry<String, Integer> entry : uniqueValues.entrySet()) { if (entry.getValue() > 3) { vocabulary.add(new VocabularyWord(entry.getKey())); } } return vocabulary; } }



党お分類さテキストからnグラムに倉換 class VocabularyBuilder { private final NGramStrategy nGramStrategy; VocabularyBuilder(NGramStrategy nGramStrategy) { if (nGramStrategy == null) { throw new IllegalArgumentException(); } this.nGramStrategy = nGramStrategy; } List<VocabularyWord> getVocabulary(List<ClassifiableText> classifiableTexts) { if (classifiableTexts == null || classifiableTexts.size() == 0) { throw new IllegalArgumentException(); } Map<String, Integer> uniqueValues = new HashMap<>(); List<VocabularyWord> vocabulary = new ArrayList<>(); // count frequency of use each word (converted to n-gram) from all Classifiable Texts // for (ClassifiableText classifiableText : classifiableTexts) { for (String word : nGramStrategy.getNGram(classifiableText.getText())) { if (uniqueValues.containsKey(word)) { // increase counter uniqueValues.put(word, uniqueValues.get(word) + 1); } else { // add new word uniqueValues.put(word, 1); } } } // convert uniqueValues to Vocabulary, excluding infrequent // for (Map.Entry<String, Integer> entry : uniqueValues.entrySet()) { if (entry.getValue() > 3) { vocabulary.add(new VocabularyWord(entry.getKey())); } } return vocabulary; } }



{ class VocabularyBuilder { private final NGramStrategy nGramStrategy; VocabularyBuilder(NGramStrategy nGramStrategy) { if (nGramStrategy == null) { throw new IllegalArgumentException(); } this.nGramStrategy = nGramStrategy; } List<VocabularyWord> getVocabulary(List<ClassifiableText> classifiableTexts) { if (classifiableTexts == null || classifiableTexts.size() == 0) { throw new IllegalArgumentException(); } Map<String, Integer> uniqueValues = new HashMap<>(); List<VocabularyWord> vocabulary = new ArrayList<>(); // count frequency of use each word (converted to n-gram) from all Classifiable Texts // for (ClassifiableText classifiableText : classifiableTexts) { for (String word : nGramStrategy.getNGram(classifiableText.getText())) { if (uniqueValues.containsKey(word)) { // increase counter uniqueValues.put(word, uniqueValues.get(word) + 1); } else { // add new word uniqueValues.put(word, 1); } } } // convert uniqueValues to Vocabulary, excluding infrequent // for (Map.Entry<String, Integer> entry : uniqueValues.entrySet()) { if (entry.getValue() > 3) { vocabulary.add(new VocabularyWord(entry.getKey())); } } return vocabulary; } }



+ class VocabularyBuilder { private final NGramStrategy nGramStrategy; VocabularyBuilder(NGramStrategy nGramStrategy) { if (nGramStrategy == null) { throw new IllegalArgumentException(); } this.nGramStrategy = nGramStrategy; } List<VocabularyWord> getVocabulary(List<ClassifiableText> classifiableTexts) { if (classifiableTexts == null || classifiableTexts.size() == 0) { throw new IllegalArgumentException(); } Map<String, Integer> uniqueValues = new HashMap<>(); List<VocabularyWord> vocabulary = new ArrayList<>(); // count frequency of use each word (converted to n-gram) from all Classifiable Texts // for (ClassifiableText classifiableText : classifiableTexts) { for (String word : nGramStrategy.getNGram(classifiableText.getText())) { if (uniqueValues.containsKey(word)) { // increase counter uniqueValues.put(word, uniqueValues.get(word) + 1); } else { // add new word uniqueValues.put(word, 1); } } } // convert uniqueValues to Vocabulary, excluding infrequent // for (Map.Entry<String, Integer> entry : uniqueValues.entrySet()) { if (entry.getValue() > 3) { vocabulary.add(new VocabularyWord(entry.getKey())); } } return vocabulary; } }



{uniqueValues.entrySet゚ントリ class VocabularyBuilder { private final NGramStrategy nGramStrategy; VocabularyBuilder(NGramStrategy nGramStrategy) { if (nGramStrategy == null) { throw new IllegalArgumentException(); } this.nGramStrategy = nGramStrategy; } List<VocabularyWord> getVocabulary(List<ClassifiableText> classifiableTexts) { if (classifiableTexts == null || classifiableTexts.size() == 0) { throw new IllegalArgumentException(); } Map<String, Integer> uniqueValues = new HashMap<>(); List<VocabularyWord> vocabulary = new ArrayList<>(); // count frequency of use each word (converted to n-gram) from all Classifiable Texts // for (ClassifiableText classifiableText : classifiableTexts) { for (String word : nGramStrategy.getNGram(classifiableText.getText())) { if (uniqueValues.containsKey(word)) { // increase counter uniqueValues.put(word, uniqueValues.get(word) + 1); } else { // add new word uniqueValues.put(word, 1); } } } // convert uniqueValues to Vocabulary, excluding infrequent // for (Map.Entry<String, Integer> entry : uniqueValues.entrySet()) { if (entry.getValue() > 3) { vocabulary.add(new VocabularyWord(entry.getKey())); } } return vocabulary; } }







蟞曞の䟋

テキスト フィルタunigramma 蟞曞

12のタスクのシヌケンスを芋぀ける必芁がありたす ニヌズ、階士、結果的に、問題 ニヌズ、階士、結果的に、任意のためのタスク、ADD、転䜍
任意のための問題 任意のためのタスク
任意の転眮を远加したす。 、任意のトランスポヌズを远加


バむグラムを構築するためにも、䞀床最埌に、実隓埌の蟞曞サむズず分類粟床の比から最高の結果を生成し、代替に遞挙を停止し、クラスを曞きたした。



クラスバむグラム
 class Bigram implements NGramStrategy { private NGramStrategy nGramStrategy; Bigram(NGramStrategy nGramStrategy) { if (nGramStrategy == null) { throw new IllegalArgumentException(); } this.nGramStrategy = nGramStrategy; } @Override public Set<String> getNGram(String text) { List<String> unigram = new ArrayList<>(nGramStrategy.getNGram(text)); // concatenate words to bigrams // example: "How are you doing?" => {"how are", "are you", "you doing"} Set<String> uniqueValues = new LinkedHashSet<>(); for (int i = 0; i < unigram.size() - 1; i++) { uniqueValues.add(unigram.get(i) + " " + unigram.get(i + 1)); } return uniqueValues; } }
      
      



テキスト{ class Bigram implements NGramStrategy { private NGramStrategy nGramStrategy; Bigram(NGramStrategy nGramStrategy) { if (nGramStrategy == null) { throw new IllegalArgumentException(); } this.nGramStrategy = nGramStrategy; } @Override public Set<String> getNGram(String text) { List<String> unigram = new ArrayList<>(nGramStrategy.getNGram(text)); // concatenate words to bigrams // example: "How are you doing?" => {"how are", "are you", "you doing"} Set<String> uniqueValues = new LinkedHashSet<>(); for (int i = 0; i < unigram.size() - 1; i++) { uniqueValues.add(unigram.get(i) + " " + unigram.get(i + 1)); } return uniqueValues; } }



<>nGramStrategy.getNGramテキスト; class Bigram implements NGramStrategy { private NGramStrategy nGramStrategy; Bigram(NGramStrategy nGramStrategy) { if (nGramStrategy == null) { throw new IllegalArgumentException(); } this.nGramStrategy = nGramStrategy; } @Override public Set<String> getNGram(String text) { List<String> unigram = new ArrayList<>(nGramStrategy.getNGram(text)); // concatenate words to bigrams // example: "How are you doing?" => {"how are", "are you", "you doing"} Set<String> uniqueValues = new LinkedHashSet<>(); for (int i = 0; i < unigram.size() - 1; i++) { uniqueValues.add(unigram.get(i) + " " + unigram.get(i + 1)); } return uniqueValues; } }



」 class Bigram implements NGramStrategy { private NGramStrategy nGramStrategy; Bigram(NGramStrategy nGramStrategy) { if (nGramStrategy == null) { throw new IllegalArgumentException(); } this.nGramStrategy = nGramStrategy; } @Override public Set<String> getNGram(String text) { List<String> unigram = new ArrayList<>(nGramStrategy.getNGram(text)); // concatenate words to bigrams // example: "How are you doing?" => {"how are", "are you", "you doing"} Set<String> uniqueValues = new LinkedHashSet<>(); for (int i = 0; i < unigram.size() - 1; i++) { uniqueValues.add(unigram.get(i) + " " + unigram.get(i + 1)); } return uniqueValues; } }



「あなたがやっお」、「あなたは」} class Bigram implements NGramStrategy { private NGramStrategy nGramStrategy; Bigram(NGramStrategy nGramStrategy) { if (nGramStrategy == null) { throw new IllegalArgumentException(); } this.nGramStrategy = nGramStrategy; } @Override public Set<String> getNGram(String text) { List<String> unigram = new ArrayList<>(nGramStrategy.getNGram(text)); // concatenate words to bigrams // example: "How are you doing?" => {"how are", "are you", "you doing"} Set<String> uniqueValues = new LinkedHashSet<>(); for (int i = 0; i < unigram.size() - 1; i++) { uniqueValues.add(unigram.get(i) + " " + unigram.get(i + 1)); } return uniqueValues; } }



<>; class Bigram implements NGramStrategy { private NGramStrategy nGramStrategy; Bigram(NGramStrategy nGramStrategy) { if (nGramStrategy == null) { throw new IllegalArgumentException(); } this.nGramStrategy = nGramStrategy; } @Override public Set<String> getNGram(String text) { List<String> unigram = new ArrayList<>(nGramStrategy.getNGram(text)); // concatenate words to bigrams // example: "How are you doing?" => {"how are", "are you", "you doing"} Set<String> uniqueValues = new LinkedHashSet<>(); for (int i = 0; i < unigram.size() - 1; i++) { uniqueValues.add(unigram.get(i) + " " + unigram.get(i + 1)); } return uniqueValues; } }



" + unigram.getI + class Bigram implements NGramStrategy { private NGramStrategy nGramStrategy; Bigram(NGramStrategy nGramStrategy) { if (nGramStrategy == null) { throw new IllegalArgumentException(); } this.nGramStrategy = nGramStrategy; } @Override public Set<String> getNGram(String text) { List<String> unigram = new ArrayList<>(nGramStrategy.getNGram(text)); // concatenate words to bigrams // example: "How are you doing?" => {"how are", "are you", "you doing"} Set<String> uniqueValues = new LinkedHashSet<>(); for (int i = 0; i < unigram.size() - 1; i++) { uniqueValues.add(unigram.get(i) + " " + unigram.get(i + 1)); } return uniqueValues; } }







これで私は停止するこずを決めたが、それは蟞曞の線纂のための蚀葉の可胜性ず、さらに凊理されるたで。 たずえば、シノニムを定矩するこずができ、共通の心にそれらをもたらすこず、などを思い付くために、あなたは自分自身の䜕かを行うこずができたす単語の類䌌性を分析するこずができたす しかし、原則ずしお、分類の粟床の有意な増加が䞎えおいたせん。



さお、先に行きたす。 蟞曞内の芁玠の数に等しくなるニュヌラルネットワヌクの入力局のサむズは、我々は、蚈算したした。



私たちのタスクの出力局の倧きさが特城の可胜な倀の数ず同じにするこずです。 ナヌザヌ、新しい機胜を助けるために、システムの゚ラヌたずえば、私たちは、「アクセスタむプ」の特性のための3぀の可胜な倀を持っおいたす。 次に、出力局のニュヌロンの数は3に等しいです。 我々は出力局で受け取るこずを期埅予め数倀の参照䞀意のセットを決定するのに必芁な特性の各倀に察しおネットワヌクを孊習した堎合 - 第二のために、0 0 1 - 最初の倀1 0 0 1 0 0第䞉のための...



隠された局の数及び寞法に関しおは、その埌特別な掚薊がありたせん。 ゜ヌスは、各特定のタスクのために最適なサむズのみ実隓により算出するこずができるこずを曞くが、先现りの入力局ず出力の倧きさの範囲内で倉化する倧きされた1぀の隠れ局、始たるネットワヌクをお勧めしたす。 たず、私は、入力局の2/3の隠れ局のサむズを䜜成しお、隠された局の数ず長さで実隓したす。 ここでは、ここであなたは、このテヌマに関する理論ずガむドラむンのビットを読み取るこずができたす。 孊習する必芁がありたすどのくらいのデヌタに぀いお告げるもありたす。



そこで、我々はネットワヌクを䜜成したした。 今、あなたは、私たちは、ニュヌラルネットワヌクの「送り」に適したテキストを数倀に倉換する方法を決定する必芁がありたす。 これを行うために、我々は、 ベクトルテキストにテキストを倉換する必芁がありたす。 単語のナニヌクなベクトルを割り圓おるために蟞曞内のすべおの単語を予めは、必芁、の量は、蟞曞のサむズに等しくなければなりたせん。 単語のベクトルを倉曎するためにネットワヌクを蚓緎した埌は䞍可胜です。 ここでは、4぀の単語の蟞曞を怜玢する方法は次のずおりです。

蟞曞で単語 ベクトルワヌド
こんにちは 1 0 0 0
どのように 0 1 0 0
業務 0 0 1 0
あなたに 0 0 0 1


ベクトルテキストでの倉換手順のテキストは、単語のテキストに䜿甚されるベクトルの远加を意味したすテキストは、「こんにちは、あなたの䞡方に」ベクタヌ「1 1 0 1」に倉換されたす。 我々はすでに、ニュヌラルネットワヌクの入力にもたらすこずができ、このベクタヌ入力局の各個々のニュヌロンのための各別々の番号ニュヌロンの数は、テキストのベクトルの倧きさにちょうど等しいです。



ベクトルテキストを蚈算する方法
 private double[] getTextAsVectorOfWords(ClassifiableText classifiableText) { double[] vector = new double[inputLayerSize]; // convert text to nGram Set<String> uniqueValues = nGramStrategy.getNGram(classifiableText.getText()); // create vector // for (String word : uniqueValues) { VocabularyWord vw = findWordInVocabulary(word); if (vw != null) { // word found in vocabulary vector[vw.getId() - 1] = 1; } } return vector; }
      
      



{ private double[] getTextAsVectorOfWords(ClassifiableText classifiableText) { double[] vector = new double[inputLayerSize]; // convert text to nGram Set<String> uniqueValues = nGramStrategy.getNGram(classifiableText.getText()); // create vector // for (String word : uniqueValues) { VocabularyWord vw = findWordInVocabulary(word); if (vw != null) { // word found in vocabulary vector[vw.getId() - 1] = 1; } } return vector; }



inputLayerSize]。 private double[] getTextAsVectorOfWords(ClassifiableText classifiableText) { double[] vector = new double[inputLayerSize]; // convert text to nGram Set<String> uniqueValues = nGramStrategy.getNGram(classifiableText.getText()); // create vector // for (String word : uniqueValues) { VocabularyWord vw = findWordInVocabulary(word); if (vw != null) { // word found in vocabulary vector[vw.getId() - 1] = 1; } } return vector; }



classifiableText.getText。 private double[] getTextAsVectorOfWords(ClassifiableText classifiableText) { double[] vector = new double[inputLayerSize]; // convert text to nGram Set<String> uniqueValues = nGramStrategy.getNGram(classifiableText.getText()); // create vector // for (String word : uniqueValues) { VocabularyWord vw = findWordInVocabulary(word); if (vw != null) { // word found in vocabulary vector[vw.getId() - 1] = 1; } } return vector; }



//単語が語圙で芋぀かりたした private double[] getTextAsVectorOfWords(ClassifiableText classifiableText) { double[] vector = new double[inputLayerSize]; // convert text to nGram Set<String> uniqueValues = nGramStrategy.getNGram(classifiableText.getText()); // create vector // for (String word : uniqueValues) { VocabularyWord vw = findWordInVocabulary(word); if (vw != null) { // word found in vocabulary vector[vw.getId() - 1] = 1; } } return vector; }







ここずここであなたは、さらに分析のためのテキストの準備に぀いお読むこずができたす。



分類粟床



蟞曞を圢成するための異なるアルゎリズムを詊した埌に隠された局ず寞法の異なる数で、私は、このバヌゞョンに萜ち着い蟞曞圢成するカットオフFilteredUnigramのredkoispolzuemyh語ず共に䜿甚したす。 第1の局ず第䞀局の倧きさの1/4 - - 第2の局2぀の隠された局は、蟞曞サむズの寞法の1/6行いたす。



このサむズのネットワヌクのための非垞に少ないです〜20の000の文章で蚓緎した埌、我々は持っおいる2000参照テキストのネットワヌクを実行したす。

Nグラム 粟床 蟞曞サむズ

redkoispolzuemyh蚀葉なし

Unigramma 58 〜25000
フィルタunigramma 73 〜1200幎
バむグラム 63 〜8000
フィルタバむグラム 69 〜3000


䞀぀の特性のため、この粟床。 あなたは、パフォヌマンスのために、より粟床が必芁な堎合は、次のように、蚈算匏は以䞋のずおりです。



  1. 右のすべおの特性を掚枬する確率は、各特性を掚枬の確率の積に等しいです。
  2. 少なくずも䞀぀の特性を掚枬する確率は、䞀ず各特性の䞍正確な決意の確率の積ずの差です。


䟋



73 - 仮定、オヌディオ特性の粟床は65の第2の特城です。 盎ちに 0.65 * 0.73 = 0.4745 = 47.45パヌセントであり、 少なくずも1぀の特性が、1-1-0,65*1-0,73で刀定粟床粟床の䞡方を決定= 0 、9055 = 90.55パヌセント。



これは、入力デヌタの前凊理マニュアルを必芁ずしないツヌルのために良い結果です。



そこ1である「しかし」「ヘルプ」のカテゎリに、より正確な分類からのテキストのカテゎリ「システム゚ラヌ」から以䞋同様のテキスト粟床が異なるカテゎリヌに分類されるべきテキストの類䌌性に倧きく䟝存しおいたす。 そのため、異なるタスクず異なる歌詞で同じネットワヌク蚭定、および語圙の粟床に倧きな違いが生じる堎合がございたす。



抂芁プログラム



私はあなたがテキストを分類したいこずにより、特性の数に瞛られない普遍的なプログラムを曞くこずにした、前に蚀いたした。 私は、プログラムの唯䞀のアルゎリズムを説明、開発のすべおの詳现を説明したせんここにいる、ず゜ヌスを参照するには、蚘事の最埌になりたす。



プログラムの䞀般的なアルゎリズム



  1. あなたが最初に起動するずプログラムがトレヌニングデヌタずXLSXファむルを芁求したす。 ファむルは、1枚のたたは2぀のシヌトから構成されおもよいです。 トレヌニングのためのデヌタの最初のペヌゞで、第二に - 曎なる詊隓のネットワヌク粟床に぀いおのデヌタ。 シヌトの構造が䞀臎しおいたす。 最初の列は、テキストを分析する必芁がありたす。 埌続の列内のテキストの特性の倀を含たなければならない任意の数が存圚しおもよいです。 最初の行は、これらの特性の名前が含たれおいる必芁がありたす。









  2. このファむルに基づき蟞曞、決定した特性ず各特性のために蚱可されるナニヌクな倀のリストを構築されおいたす。 このすべおは、リポゞトリに栌玍されおいたす。
  3. これは、各特性のための個別のニュヌラルネットワヌクを䜜成したす。
  4. すべおの䜜成されたニュヌラルネットワヌクは蚓緎され、保持されたす。
  5. あなたはすべおの蚓緎されたニュヌラルネットワヌクがロヌドされお保存され、次回。 プログラムは、テキストを解析する準備ができおいたす。
  6. 埗られたテキストは、それぞれ独立しお、ニュヌラルネットワヌクの凊理され、そしお党䜓的な結果は、各特性の倀ずしお䞎えられたす。











蚈画





゜ヌスコヌドのビット



゜ヌスは、特定の蚭蚈パタヌンの䜿甚䟋ずしお有甚であり埗たす。 別の蚘事でそれを我慢しおいるので、この蚘事でも聞かせお、意味がありたせんが、たた、私は私の経隓を共有しおいるので、それらに぀いお沈黙するこずも望たしいこずではありたせん。





完党な゜ヌスコヌド https://github.com/RusZ/TextClassifier



建蚭的な提案ず批刀を歓迎したす。



PSはレナの堎合は、心配しないでください - それは架空の人物です。



All Articles