Пример #1
0
        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--;
        }
Пример #2
0
 /// <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);
     }
 }