private void RadialNeuralLearn() { if (learningDocInfo != null && learningDocInfo.SourceDir != Settings.Default.pathLearningDir) { learningDocInfo = null; } //ładuje listę kategorii DocumentClass.LoadFromFiles(Settings.Default.pathLearningDir, PreprocessingConsts.CategoryFilePattern); //stworzenie słownika dictionary = DictionaryFactory(Settings.Default.pathSummaryFile); //dictionary.LearningData = new List<DocClass.Src.Learning.LearningPair>(); //stworzenie sieci radialNetwork = new RadialNetwork(Settings.Default.numberNeuronsHidden, DocumentClass.CategoriesCount); DocumentList dl = PreprocessingUtility.CreateLearningDocumentList(Settings.Default.pathLearningDir, dictionary, (DocumentRepresentationType)Settings.Default.documentRepresentationType, learningDocInfo); if (radialNetwork.Learn(dl) == false) { radialNetwork = null; dictionary = null; } }
/// <summary> /// Odczytuje sieć nuronową z podanego pliku. /// </summary> /// <param name="pathFile">Scieżka do pliku.</param> public void LoadRadialNetwork(String pathFile) { Stream stream = File.Open(pathFile, FileMode.Open); BinaryFormatter bFormatter = new BinaryFormatter(); this.radialNetwork = (RadialNetwork)bFormatter.Deserialize(stream); this.dictionary = (Dictionary)bFormatter.Deserialize(stream); this.learningDocInfo = (LearningDocInfo)bFormatter.Deserialize(stream); DocumentClass.DocumentCategories = (List <String>)bFormatter.Deserialize(stream); this.learnDocumentRepresentationType = (DocumentRepresentationType)bFormatter.Deserialize(stream); this.learnDictionaryType = (DictionaryType)bFormatter.Deserialize(stream); LoadSettings(stream, bFormatter); stream.Close(); this.form.LoadClassificatorEnd(ClasyficatorType.RadialNeural); }
/// <summary> /// Tworzy nowy słownik. /// </summary> /// <param name="sourceDir">Katalog zawierający wszystkie pliki uczące.</param> /// <param name="summaryFile">Plik z podsumowaniem wszystkich plików.</param> /// <param name="size">Ilość słów w słowniku</param> public CtfIdfDictionary(String sourceDir, String summaryFile, int size) { Dictionary <String, WordCountPair> tmpDictionary = new Dictionary <string, WordCountPair>(); //wczytanie informacji o wszystkich słowach LearningDocInfo learningDocInfo = new LearningDocInfo(sourceDir, summaryFile); Dictionary <String, WordInfo> allWords = learningDocInfo.AllWordsInfo; int allDocCount = learningDocInfo.AllDocCount; //tworzenie słownika DirectoryInfo sourceDirInfo = new DirectoryInfo(sourceDir); foreach (DirectoryInfo dirInfo in sourceDirInfo.GetDirectories()) //przechodzę po wszystkich podkatalogach { DirectoryInfo stemDir = new DirectoryInfo(dirInfo.FullName + "//stem"); foreach (FileInfo fileInfo in stemDir.GetFiles()) //przechodzę po wszystkich plikach { WordCountList wordsInFile = new WordCountList(fileInfo.FullName); int wordsInDocCount = wordsInFile.GetAllWordsCount(); foreach (WordCountPair wordCountPair in wordsInFile) //przechodzę po wszsytkich słowach { double tfIdf = PreprocessingUtility.ComputeTfIdf(wordCountPair.Count, wordsInDocCount, allDocCount, allWords[wordCountPair.Word].InclDocCount); if (tmpDictionary.ContainsKey(wordCountPair.Word)) { tmpDictionary[wordCountPair.Word].Count += tfIdf; } else { tmpDictionary.Add(wordCountPair.Word, new WordCountPair(wordCountPair.Word, tfIdf)); } } } } //wybranie odpowiednich słów WordCountPair[] tmpArray = new WordCountPair[tmpDictionary.Count]; tmpDictionary.Values.CopyTo(tmpArray, 0); Array.Sort(tmpArray); Array.Reverse(tmpArray); //kopiowanie do właściwej listy wordList = new List <string>(); for (int i = 0; i < size; i++) { wordList.Add(tmpArray[i].Word); } }
/// <summary> /// Metoda zwracająca reprezentacjie dokumentu na podstawie /// wybranej opcji. /// </summary> /// <param name="pathFile"></param> /// <returns></returns> private Document DocumentFactory(String pathFile) { switch ((DocumentRepresentationType)Settings.Default.documentRepresentationType) { case DocumentRepresentationType.Binary: return(new BinaryDocument(pathFile, dictionary, null)); case DocumentRepresentationType.Own: return(new OwnDocument(pathFile, dictionary, null)); case DocumentRepresentationType.TfIdf: if (learningDocInfo == null) { learningDocInfo = new LearningDocInfo(Settings.Default.pathLearningDir, Settings.Default.pathSummaryFile); } return(new TfIdfDocument(pathFile, dictionary, null, learningDocInfo)); default: throw new NotImplementedException("Nieznany typ dokumentu."); } }
/// <summary> /// Metoda zwracające odpowiednią reprezentacjie słownika na /// podstweie wybranej opcji. /// </summary> /// <param name="pathSummary"></param> /// <returns></returns> private Dictionary DictionaryFactory(String pathSummary) { WordCountList wordCountList = new WordCountList(pathSummary); if (learningDocInfo == null) { learningDocInfo = new LearningDocInfo(Settings.Default.pathLearningDir, Settings.Default.pathSummaryFile); } switch ((DictionaryType)Settings.Default.dictionaryType) { case DictionaryType.CtfIdf: return(new CtfIdfDictionary(Settings.Default.pathLearningDir, pathSummary, wordCountList.GetUniqueWordsCount())); case DictionaryType.Fixed: return(new FixedDictionary(Settings.Default.pathLearningDir, wordCountList.GetUniqueWordsCount())); case DictionaryType.Frequent: return(new FrequentDictionary(pathSummary, wordCountList.GetUniqueWordsCount())); default: throw new NotImplementedException("Nieznany typ słownika."); } }
/// <summary> /// Dodaje listê dokumentów na podstawie katalogu z plikami w postaci s³owo, iloœæ wyst¹pieñ. /// </summary> /// <param name="sourceDir">Katalog z plikami.</param> /// <param name="dictionary">Rodzaj s³ownika, który ma byæ u¿yty do tworzenia nowych dokumentów.</param> /// <param name="drt">Rodzaj dokumentów.</param> /// <param name="className">Nazwa klasy, do której maj¹ nale¿eæ wszystkie nowo dodane elementu lub null, jeœli klasa jest nieznana.</param> /// <param name="learningDocInfo">Obiekt zawieraj¹cy informacje o wszystkich dokumentach ucz¹cych. /// Je¿eli dana reprezentacja nie potrzebuje tego obiektu, parametr jest ignorowany.</param> public void AddDocumentsFromDir(String sourceDir, Dictionary dictionary, DocumentRepresentationType drt, String className, LearningDocInfo learningDocInfo) { CheckCorrectness(drt, dictionary.GetDictionaryType()); Console.WriteLine("Adding dir: " + sourceDir); DirectoryInfo sourceDirInfo = new DirectoryInfo(sourceDir); foreach (FileInfo fileInfo in sourceDirInfo.GetFiles()) { Console.WriteLine("Adding file: " + fileInfo.FullName); switch (drt) { case DocumentRepresentationType.TfIdf: documentList.Add(new TfIdfDocument(fileInfo.FullName, dictionary, className, learningDocInfo)); break; case DocumentRepresentationType.Binary: documentList.Add(new BinaryDocument(fileInfo.FullName, dictionary, className)); break; case DocumentRepresentationType.Own: documentList.Add(new OwnDocument(fileInfo.FullName, dictionary, className)); break; default: throw new Exception("Unknown DocumentRepresentationType: " + drt); } } }
/// <summary> /// Tworzy listê na podstawie katalogu z plikami w postaci s³owo, iloœæ wyst¹pieñ. /// </summary> /// <param name="sourceDir">Katalog z plikami.</param> /// <param name="dictionary">Rodzaj s³ownika, który ma byæ u¿yty do tworzenia nowych dokumentów.</param> /// <param name="drt">Rodzaj dokumentów.</param> /// <param name="className">Nazwa klasy, do której maj¹ nale¿eæ wszystkie nowo dodane elementu lub null, jeœli klasa jest nieznana.</param> /// <param name="learningDocInfo">Obiekt zawieraj¹cy informacje o wszystkich dokumentach ucz¹cych. /// Je¿eli dana reprezentacja nie potrzebuje tego obiektu, parametr jest ignorowany.</param> public DocumentList(String sourceDir, Dictionary dictionary, DocumentRepresentationType drt, String className, LearningDocInfo learningDocInfo) { documentList = new List <Document>(); AddDocumentsFromDir(sourceDir, dictionary, drt, className, learningDocInfo); }
/// <summary> /// Tworzy dokument na podstawie wcześniej przygotowanego pliku. /// </summary> /// <param name="fileName">Plik z danymi.</param> /// <param name="dictionary">Słownik, na podstawie którego tworzony jest dokument.</param> /// <param name="className">Nazwa klasy, do której należy dany dokument lub null, jeśli klasa jest nieznana.</param> /// <param name="learningDocInfo">Obiekt zawierający informacje o wszystkich dokumentach uczących.</param> public TfIdfDocument(String fileName, Dictionary dictionary, String className, LearningDocInfo learningDocInfo) : base(dictionary) { wordCountList = new WordCountList(); if (className != null) { classNo = DocumentClass.GetClassIndex(className); } //tworze liste wszystkich słów ze wszystkuch dokumentów Dictionary <String, WordInfo> allWordsInfo = learningDocInfo.AllWordsInfo; double allDocNumber = learningDocInfo.AllDocCount; //tworze liste słów w dokumencie WordCountList wordsInDoc = new WordCountList(fileName); int wordsInDocCount = wordsInDoc.GetAllWordsCount(); foreach (String word in dictionary) { if (wordsInDoc[word] != -1) { double inclDocCount = allWordsInfo[word].InclDocCount; //double tfIdf = (wordsInDoc[word] / wordsInDocCount) * Math.Log10(allDocNumber/inclDocCount); double tfIdf = PreprocessingUtility.ComputeTfIdf(wordsInDoc[word], wordsInDocCount, allDocNumber, inclDocCount); wordCountList.Add(new WordCountPair(word, tfIdf)); } else { wordCountList.Add(new WordCountPair(word, 0)); } } }