Дипломная работа: Индексации хранилища текстов на основе естественно-языковой адресации

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

//for (int i = 0; i < documentIds.Count(); i++)

//{

// documents[i] = GetDocument(documentIds[i]);

//}

//return documents;

}

public Corpus[] GetCorpora(int UserId)

{

using (var context = new PaperCatModelContainer())

{

List<CorpusModel> corpusModels;

if (UserId != 0)

corpusModels = context.CorpusModelSet.Where(c => c.User.UserId == UserId).ToList();

else

corpusModels = context.CorpusModelSet.Where(c => c.User == null).ToList();

Corpus[] corpuses = new Corpus[corpusModels.Count()];

for (int i = 0; i < corpusModels.Count(); i++)

{

corpuses[i] = corpusModels[i].GetCorpusFromModel();

}

return corpuses;

}

}

public Document GetDocument(int DocumentId)

{

DocumentModel doc;

using (var context = new PaperCatModelContainer())

{

doc = context.DocumentModelSet.Find(DocumentId);

if (doc == null)

return null;

return GetFullDocument(doc);

}

}

private static Document GetFullDocument(DocumentModel document)

{

return GetDocumentNonRelationalProperties(document.GetDocumentFromModel(), GetDocumentClient());

}

public Document[] GetDocuments(int CorpusId)

{

using (var context = new PaperCatModelContainer())

{

var documentList = context.DocumentModelSet.Where(d => d.Сorpus.CorpusId == CorpusId).ToList();

Document[] documents = new Document[documentList.Count];

for (int i = 0; i < documentList.Count; i++)

{

documents[i] = GetFullDocument(documentList[i]);

}

return documents;

}

}

public int MakeCommonCorpus(string Name, Document[] documents)

{

return MakeCorpus(Name, documents, 0);

}

public int MakeCorpus(string Name, Document[] documents, int UserId)

{

using (var context = new PaperCatModelContainer())

{

CorpusModel corpusModel = new CorpusModel()

{

CorpusName = Name,

User = context.UserModelSet.FirstOrDefault(u => u.UserId == UserId)

};

context.CorpusModelSet.Add(corpusModel);

context.SaveChanges();

if (documents != null)

foreach (var item in documents)

{

item.CorpusId = corpusModel.CorpusId;

AddDocument(item);

}

return corpusModel.CorpusId;

}

}

public void UpdateCorpus(Corpus corpus)

{

if (corpus == null)

throw new Exception("Параметр не может быть null");

using (var context = new PaperCatModelContainer())

{

var corpusModel = context.CorpusModelSet.Find(corpus.CorpusId);

if (corpusModel == null)

{

throw new Exception("Такого корпуса не существует");

}

corpusModel.CorpusName = corpus.CorpusName;

context.SaveChanges();

}

}

public void UpdateDocument(Document document, bool IsTextChanged)

{

if (document == null)

throw new Exception("Параметр не может быть null");

using (var context = new PaperCatModelContainer())

{

var documentModel = context.DocumentModelSet.Find(document.DocumentId);

if (documentModel == null)

{

throw new Exception("Такого документа не существует");

}

documentModel.Name = document.Name;

documentModel.OriginalFile = document.OriginalFile;

document.CorpusId = documentModel.Сorpus.CorpusId; //документ остается в том же корпусе

context.SaveChanges();

}

DocumentClient client = GetDocumentClient();

string selfLink = GetDocumentSelfLink(document.DocumentId, client);

if (IsTextChanged)

{

Task.Run(() => { DeleteDocumentFromIndexStructure(document.DocumentId, document.CorpusId); AddDocumentToIndexStructure(document); } );

}

if (selfLink != null)

client.ReplaceDocumentAsync(selfLink, new AzureDocument(document)).Wait();

}

public void UpdateUser(User user)

{

if (user == null)

throw new Exception("Параметр не может быть null");

using (var context = new PaperCatModelContainer())

{

var userModel = context.UserModelSet.Find(user.UserId);

if (userModel == null)

{

throw new Exception("Такого пользователя не существует");

}

userModel.FIO = user.FIO;

if (IsThisLoginExist(user.Login, context, user.UserId))

{

throw new Exception("Другой пользователь с таким логином уже существует");

}

userModel.Login = user.Login;

userModel.Password = user.Password;

userModel.Email = user.Email;

context.SaveChanges();

}

}

}

}

{

public class NLAStructureHelper

{

private const int nSymbols = 3;

string HeadSelfLink = "";

NLAStructure Head;

DocumentClient documentClient;

/// <summary>

/// Поиск осуществляется отдельно для каждого корпуса

/// </summary>

/// <param name="client"></param>

/// <param name="Corpusid"></param>

public NLAStructureHelper(DocumentClient client, int Corpusid, bool isForceCreate = true)

{

documentClient = client;

Head = LoadHead(Corpusid, isForceCreate);

}

/// <summary>

/// Добавить id документа к данному слову

/// </summary>

/// <param name="word"></param>

/// <param name="documentId"></param>

public void Add(string word, int documentId)

{

NLAStructure structure = Head;

string CurrentStructureLink = HeadSelfLink;

for (int i = 0; i < word.Length; i += nSymbols)

{

string key = word.Length < i + nSymbols ? word.Substring(i) : word.Substring(i, nSymbols);

IndexStructureObject obj;

if (structure.Dictionary.ContainsKey(key))

obj = structure.Dictionary[key];

else

{

obj = new IndexStructureObject();

structure.Dictionary.Add(key, obj);

}

if (i + nSymbols >= word.Length) //дошли до нужного листа

{

obj.DocumentIds.Add(documentId);

SaveChanges(CurrentStructureLink, structure);

}

else

{

NLAStructure oldNLAStructure = structure;

structure = GetNextStructure(obj);

SaveChanges(CurrentStructureLink, oldNLAStructure);

CurrentStructureLink = obj.NextStructureSelfLink;

}

}

}

/// <summary>

//// Удалить все вхождения id документа из структуры

/// </summary>

/// <param name="documentId"></param>

public void Delete(int documentId)

{

Delete(documentId, Head, HeadSelfLink);

}

private bool Delete(int documentId, NLAStructure NLAStructure, string CurrentStructureLink)

{

if (NLAStructure != null)

{

var TemtDictionary = new Dictionary<string, IndexStructureObject>(NLAStructure.Dictionary);

foreach (var item in TemtDictionary)

{

IndexStructureObject iso = item.Value;

NLAStructure nextNLAStructure = GetNextStructure(iso, false);

if (nextNLAStructure != null)

if (Delete(documentId, nextNLAStructure, iso.NextStructureSelfLink))

iso.NextStructureSelfLink = "";

iso.DocumentIds.Remove(documentId);

if (iso.NextStructureSelfLink == "" && iso.DocumentIds.Count == 0)

{

NLAStructure.Dictionary.Remove(item.Key);

}

}

}

if (NLAStructure.Dictionary.Count == 0)

{

documentClient.DeleteDocumentAsync(CurrentStructureLink);

return true;

}

SaveChanges(CurrentStructureLink, NLAStructure);

return false;

}

private NLAStructure GetNextStructure(IndexStructureObject indexStructureObject, bool isForcedCreate = true)

{

if (indexStructureObject.NextStructureSelfLink != "")

{

Document doc = documentClient.ReadDocumentAsync(indexStructureObject.NextStructureSelfLink).Result;

NLAStructure Structure = (dynamic)doc;

return Structure;

}

else if (isForcedCreate)

{

NLAStructure newStructure = new NLAStructure();

Document doc = documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(Properties.Resources.DataBaseId, Properties.Resources.IndicesCollectionId), newStructure).Result;

indexStructureObject.NextStructureSelfLink = doc.SelfLink;

return newStructure;

}

else return null;

}

private void SaveChanges(string StructureLink, NLAStructure structure)

{

documentClient.ReplaceDocumentAsync(StructureLink, structure).Wait();

}

private NLAStructure LoadHead(int CorpusId, bool isForceCreate = true)

{

Uri documentCollectionUri = UriFactory.CreateDocumentCollectionUri(Properties.Resources.DataBaseId, Properties.Resources.IndicesCollectionId);

Microsoft.Azure.Documents.Document doc = CorpusId != 0 ?

documentClient.CreateDocumentQuery(documentCollectionUri).AsEnumerable().Where(d => d.GetPropertyValue<int>("CorpusId") == CorpusId).FirstOrDefault()

: null ;

NLAHeadDocument Structure = null;

if (doc != null)

{

Structure = (dynamic)doc;

HeadSelfLink = doc.SelfLink;

}

else if (isForceCreate)

{

Structure = new NLAHeadDocument(CorpusId);

doc = documentClient.CreateDocumentAsync(documentCollectionUri, Structure).Result;

HeadSelfLink = doc.SelfLink;

}

return Structure;

}

internal List<int> FindWordDocumentIds(string word)

{

NLAStructure structure = Head;

IndexStructureObject obj = null;

for (int i = 0; i < word.Length; i += nSymbols)

{

string key = word.Length < i + nSymbols ? word.Substring(i) : word.Substring(i, nSymbols);

if (structure != null && structure.Dictionary.ContainsKey(key))

{

obj = structure.Dictionary[key];

structure = GetNextStructure(obj, false);

}

else return new List<int>();

}

if (obj != null)

return obj.DocumentIds;

return new List<int>();

}

}

}

Источник: https://otherreferats.allbest.ru/download/1017960/