private async Task MakeWorkAsync(string filePath) { _threadCount++; try { if (await _dbInstance.CheckMongoConnection()) { if (!await _dbInstance.IsFileInDbAsync(FileActions.FileHash(filePath))) { var documentTfIdfDict = await DocumentActions.MakeTfIdfVectorAsync( DocumentActions.MakeTfVector(DocumentActions.GetWordCanonedTokens(filePath))); var allDocuments = await _dbInstance.GetAllDocumentsAsync(); var cosineSimilarityList = new List <double>(); var similarityDocuments = new List <PlagiarismDetectExpandedResult>(); foreach (var document in allDocuments) { var currentDocumentTfIdfDict = await DocumentActions.MakeTfIdfVectorAsync( document.DocumentTfVector); var vectors = MakeVectorsForCompare(currentDocumentTfIdfDict, documentTfIdfDict); var cosineSim = Cosine_similarity(vectors.Item1, vectors.Item2); cosineSimilarityList.Add(cosineSim); if (cosineSim >= 0.4) { similarityDocuments.Add(new PlagiarismDetectExpandedResult(document.DocumentPath, document.DocumentName, cosineSim)); } } M_Model.HandledFiles.Add(new PlagiarismDetectResult(Path.GetFileNameWithoutExtension(filePath), cosineSimilarityList.Max() * 100, similarityDocuments)); } else { M_Model.HandledFiles.Add(new PlagiarismDetectResult(Path.GetFileNameWithoutExtension(filePath), 100)); } } } catch (Exception e) { await Console.Error.WriteLineAsync( "Не удалось подключиться к серверу MongoDb! \nВыполнение дальнейшей работы невозможно!\n" + e); StopProgramm(); } _threadCount--; }
/// <summary> /// Обработка файла по указанному пути. /// </summary> /// <param name="filePath">Путь к файлу.</param> /// <returns></returns> private static async Task MakeWork2Async(string filePath) { //Проверяем состояние сервера MongoDb. if (await DataBase.GetInstance().CheckMongoConnection()) { //Инкрементируем к-ство выполняемых потоков. ++_threadCount; if (!await DataBase.GetInstance().IsFileInDbAsync(FileActions.FileHash(filePath))) { var canonedTokens = DocumentActions.GetWordCanonedTokens(filePath); DocumentActions.Cyrillify(ref canonedTokens); var extension = Path.GetExtension(filePath); //эта переменная будет использоваться для занесения в базу пути файла и ее производных var newFilePath = filePath; //поскольку формат *.doc пересохраняется в *.docx после вызова метода GetWordCanonedTokens, //то при вставке документа в БД используется новый формат *.docx if (extension != null && extension.Equals(".doc")) { newFilePath += "x"; } newFilePath = FileActions.FileMoveOrDelete(newFilePath, FileActionType.RenameAndMove); var fileName = Path.GetFileNameWithoutExtension(filePath); //Здесь будут хранится данные из имени файла. string[] fileNameData; try { fileNameData = DocumentActions.SplitFileName(fileName); } catch (FileNameFormatException ex) { LogViewModel.AddNewLog(ex.Message + " " + fileName, DateTime.Now, LogType.Information); fileNameData = new[] { "Undefined", //ФИО-автора "Undefined", //Группа автора fileName //Название работы }; } //создаем новый документ <Document> для вставки в коллекцию var insertDoc = new Document( fileNameData[2], //Здесь хранится имя документа fileNameData[0], //Здесь хранится ФИО автора документа fileNameData[1], //Здесь хранится группа автора документа newFilePath, Path.GetExtension(newFilePath), FileActions.FileHash(newFilePath), canonedTokens.ToArray(), DocumentActions.MakeTfVector(canonedTokens), File.GetLastWriteTime(newFilePath)); //вставляем в БД await DataBase.GetInstance().InsertDocumentAsync(insertDoc); } else { var fileName = Path.GetFileNameWithoutExtension(filePath); LogViewModel.AddNewLog("Файл " + fileName + " уже есть в базе данных!", DateTime.Now, LogType.Information); FileActions.FileMoveOrDelete(filePath, FileActionType.MoveDuplicate); } --_threadCount; } else { StopProgramm(true); } }