Разработка системы поиска документов релевантных заданному тексту

Обоснование выбора метода извлечения ключевых слов. Анализ предметной области, проектирование информационной системы поиска релевантных документов. Реализация запросов к электронным библиотекам. Реализация интерфейса системы поиска релевантных документов.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 21.09.2016
Размер файла 1,1 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Третья вкладка содержит результаты поискового запроса по ключевым словам.

Главная форма разработанного приложения показана на рисунке 3.6.

Рисунок 3.6. Главная форма приложения

При нажатии на кнопку «Извлечение ключевых слов» система начинает обработку текста и по завершении работы алгоритма переключает фокус на вторую вкладку с результатами извлечения ключевых слов. Результат извлечения ключевых фраз системой для данной работы показан на рисунке 3.7. Как можно видеть, полученные ключевые термины отражают предметную область исследования.

Рисунок 3.7. Результаты извлечения ключевых слов

Далее пользователь может выбрать ключевые слова для запроса, отметив их галочками. При нажатии на кнопку «Поиск по выбранным фразам» открывается дополнительное окно с выбранными ключевыми словами, где пользователь может изменить параметры запроса, добавить свои слова для поиска. После чего система производит поисковый запрос и возвращает пользователю результаты. Результат работы системы показан на рисунке 3.8.

Рисунок 3.8. Результаты поиска по ключевым словам

Результаты поискового запроса схожи по тематике с данным исследованием. Например, работа [4], также была возвращена по результатам поискового запроса. Присутствует возможность фильтровать полученные результаты по типу (PDF,HTML, книга, ссылка).

Выводы по третьей главе

По результатам третьей главы было разработано приложение, позволяющее производить поиск схожих по тематике документов, на основе текста исходного документа.

Был разработан компонент извлечения ключевых слов, который производит отбор ключевых терминов с помощью метрики TF-IDF. Также разработан компонент, реализующий запросы к поисковой системе GoogleScholar и производящий разбор полученных результатов.

Компоненты интегрированы в единую систему в виде Windows Forms приложения. Интерфейс системы реализован в стиле Modern UI.На вход приложению подается исходный документ, либо текст вводится пользователем вручную. Система осуществляет извлечение ключевых терминов из заданного текста и выводит их пользователю. Далее пользователь может выбрать определенные термины для поиска документов. Система осуществляет поисковый запрос к Академии Гугл, производит разбор результатов и предоставляет пользователю описания и ссылки на научные публикации по данной теме.

Заключение

При изучении предметной области был проведен анализ различных систем, производящих поиск документов на основе текущего текста. Рассмотрены системы, имеющие свою базу документов и системы, использующие для поиска сеть Интернет. Была выявлена нехватка систем, которые позволяли бы автоматизировать процесс поиска научной литературы по интересующей теме на основе текущего документа и тем самым снижали бы трудоемкость данного процесса.Это послужило основанием для разработки системы поиска документов релевантных заданному тексту.

В результате анализа методов извлечения ключевых слов и их сравнения с целью выбора метода для программной реализации был выбран статистический подход, а именно метрика TF-IDF, в соответствии с которой учитывается встречаемость термина в текущем документе и в корпусе документов. Метрика позволяет проводить качественное извлечение ключевых терминов и при этом достаточно легко реализуема в программном коде.

В результате анализа четырех наиболее популярных научных ресурсов, позволяющих искать русскоязычную научную литературу была выбрана Академия Гугл, которая может производить поиск документов по ключевым словам и покрывает множество научных ресурсов. Страница возвращаемых Академией Гугл результатов обладает удобной разметкой для программного разбора.

Во время анализа требований, поведения и структуры программы, было проведено моделирование системы с использованием языка UML. Для формализации функциональных требований построена диаграмма прецедентов, выявлены основные акторы системы, и детально описан каждый прецедент. Для описания модели поведения системы построены диаграммы последовательностей. Также определена логическая структура системы путем построения диаграммы классов.

В результате работы была разработана система поиска документов релевантных содержанию текста, реализованная в виде Windows Forms приложения. Система автоматизирует оба этапа поиска:осуществляет извлечение ключевых слов из текста и предоставляет пользователю список релевантных документов, осуществляя запрос к научным библиотекам и обрабатывая результаты.

В результате выполнения вышеперечисленных задач была достигнута поставленная цель-разработана система поиска документов релевантных заданному тексту.

Данная работа прошла апробацию на следующих конференциях:

Всероссийская научно-практическая конференция молодых учёных с международным участием «Математика и междисциплинарные исследования - 2016» (ПГНИУ, г. Пермь); результаты исследования представлены в виде тезисов и включены в сборник трудов конференции [8].

Международная конференции молодых учёных по программной инженерии SYRCoSE 2016 (г. Москва).

Потенциальными пользователями разработанной программы могут быть студенты, преподаватели, научные работники.

В дальнейшем система может быть реализована в виде веб-приложения для использования широким кругом пользователей.Также в настоящее время идет разработка API для GoogleScholar, соответственно, компонент запросов может быть модифицирован для взаимодействия с API, что ускорит и упростит работу системы.

Библиографический список

АкадемияGoogle // GoogleScholar. 2004. URL: https://scholar.google.ru (датаобращения: 15.05.2016).

АОТ // Автоматическая обработка текста. 2003. URL: http://aot.ru/ (дата обращения: 13.03.2016).

Астраханцев Н. А. Методы и программные средства извлечения терминов из коллекции текстовых документов предметной области: дис. … канд. физ.-мат. наук. М., 2014.

Браславский П. И., Соколов Е. А. Автоматическое извлечение терминологии с использованием поисковых машин Интернета // Компьютерная лингвистика и интеллектуальные технологии. Тр. Международной конференции «Диалог», 2007. С. 89-94.

Калиниченко А. В. Диалоговый метод автоматизации поиска семантически похожих документов // Вестник Воронежского государственного технического университета. 2012. Вып.8(8). С.15-17.

КиберЛенинка // Научная электронная библиотека «Киберленинка». 2012. URL: http:// cyberleninka.ru (дата обращения: 18.05.2016).

Морфологическийанализатор pymorphy // Documentation of vatious Python packages. 2009. URLhttps://pythonhosted.org/pymorphy (дата обращения: 13.05.2016).

Полушин Г.В. Система поиска документов релевантных заданному тексту // Математика и междисциплинарные исследования: сб. докл. всеросс. науч.-практ. конф. с междунар. участием, Пермь, 16-19 мая 2016 г. / гл. ред. Ю.А.Шарапов. Пермь: Перм. гос. нац. исслед. ун-т, 2016. С. 266-270.

Усталов Д. А. Извлечение терминов из русскоязычных текстов при помощи графовых моделей // Теория графов и приложений: материалы конференции - Екатеринбург: Изд-во Уральского гос. ун-та, 2012. С. 62-29.

Федоренко Д. Г., Астраханцев Н. А., Турдаков Д. Ю. Автоматическое распознавание предметно-специфичных терминов: экспериментальная проверка // Труды Института Системного Программирования РАН. 2014. Вып.4. С.55-72.

Шереметьева С. О., Осминин П. Г., Методы и модели автоматического извлечения ключевых слов // Вестник Южно-Уральского государственного университета. 2015. Вып.1(12). С.76-81.

Электронная библиотека РГБ // Российская Государственная Библиотека. 1999. URL: http://elibrary.rsl.ru/ (дата обращения: 18.05.2016).

Broder A., Glassman S., Manasse M. Syntatic clustering of the Web // Computer Networks and ISDN Systems. 1997. Vol. 29(8-13). P. 1157-1166.

Charikar M. Similarity estimation techniques from rounding algorithms // ACM symposium on Theory of computing. 2002. P 380-388.

Church K., Hanks P. Word Association norms, mutual information, and lexicography // Computational linguistics. 1990. Vol. 16(1). P. 22-29.

Church K., Hanks P., Hindle D. Using Statistics in Lexical Analysis // Lexical Acquisition: Using On-Line Resourses ro Build a Lexicon. Lawrence Erlbaum, 1991. P. 115-164.

Dobrov B. V., Loukachevitch N. V. Multiple Evidence for Term Extraction in Broad Domains // Proceedings of Recent Advances in Natural Language Processing, Hissar, 12-14 September 2011. P. 710-715.

eLibrary // Научная электронная библиотека eLibrary. 2000. URL: http://elibrary.ru/defaultx.asp (дата обращения: 11.03.2016).

Evans D. A., Lefferts R. G. Clarit-trec experiments // Information processing & management. 1995. Vol. 31(3). P. 385-395.

Frantzi K., Ananiadou S., Mima H. Automatic recognition of multi-word terms: the c-value/nc-value method // International Journal on Digital Libraries. 2000. Vol. 3(2). P. 115-130.

Govindaraju V., Ramanathan. K. Similar Document Search and Recommendation // Journal of Emerging Technologies in Web Intelligence. 2012. Vol. 4(1). P. 84-93.

Html Agility Pack // CodePlex. 2012. URL: https://htmlagilitypack.codeplex.com (датаобращения: 19.04.2016).

IBM - eDiscovery Analyzer // IBM. URL: http://www-03.ibm.com/software/products/ru/edisanal (датаобращения: ).

Lopez P. Automatic Key Term Extraction from Scientific Articles in GROBID // Proceedings of the 5th International Workshop on Semantic Evaluation. Uppsala, 2010. P 248-251.

Meijer K., Fransincar F., Hogenboom F. A semantic approach for extracting domain taxonomies from text // Decision Support Systems. 2014. P. 78-93.

Mystem // Технологии Яндекса. 2014. URLhttps://tech.yandex.ru/mystem (дата обращения: 14.05.2016).

Pazienza M., Pennacchiotti M., Zanzotto F. Terminology extraction: an analysis of linguistic and statistical approaches // Knowledge Mining: Proceedings of the NEMIS 2004 Final Conference. Berlin: Springer, 2005. P. 255-279.

Penas A., Verdeio F., Gonzalo J. Corpus-based terminology extraction to information access // Proceedings of the Corpus Linguistics. 2001. Vol. 13.

SearchInform // Информационная безопасность предприятия - SearchInform. 2006. URL: http://searchinform.ru/ (дата обращения: 15.02.2016).

Turney P. Learning Algorithms for Keyphrase Extraction // Information Retrieval. 2000. Vol. 2(4). P. 303-336.

Wang J., Peng H., Hu J. Automatic Keyprases Extraction from Document Using Neural Network // Advances in Machine Learning and Cybernetics. Berlin: Springer, 2006. P. 633-641.

Wermter J., Hahn U. You can't beat frequency (unless you use linguistic knowledge): a qualitative evaluation of association measures for collocation and term extraction // Proceedings of the 21st International Conference on Computational Linguistics and the 44th annual meeting of the Association for Computational Linguistics., Sydney, July 2006. P. 785-792.

Williams K., Wu J. SimSeerX: A Similar Document Search Engine // Proceedings of the 2014 ACM symposium on Document engineering, NY, 2014. P. 143-146.

Xiaoyue L., Chunyu K. An Improved Corpus Comparison Approach to Domain Specific Term Recognition // Proceedings of 22nf Pacific Asia Conference on Language, Information and Computation, 2008. P. 253-261.

Yang Y., Bansal N., Dakka W. Query By Document // Proceedings of the Second ACM International Conference on Web Search, NY, 2009. P. 34-43.

Zhang Z., Brewster C., Ciravegna F. A Comparative Evaluation of Term Recognition Algorithms // Proceedings of the Sixth International Conference on Language Resources and Evaluation, Marrakech, 28-31 May 2008.

Приложение А. Диаграммы последовательностей

Рисунок А.1. Диаграмма последовательностей «Ввод текста»

Рисунок А.2. Диаграмма последовательностей «Извлечение ключевых слов»

Рисунок А.3. Диаграмма последовательностей «Расчет коэффициентов»

Рисунок А.4. Диаграмма последовательностей «Поиск по ключевым словам»

Приложение Б. Блок-схема алгоритма извлечения ключевых слов

Рисунок Б.1. Блок-схема алгоритма извлечения ключевых слов

Приложение В. Листинг программы

В приложении представлены основные методы наиболее значимых классов системы.

KeyPhrase

publicclassKeyPhrase

{

bool _best;

bool _unknown;

bool _adj_noun;

string _result;

int _counter;

double _tf_idf;

bool _oneWord;

int _idf;

publicint articleNum = 0;

publicbool Unknown

{

get { return _unknown; }

set { _unknown = value; }

}

publicbool Best

{

get { return _best; }

set { _best = value; }

}

publicbool OneWord

{

get { return _oneWord; }

set { _oneWord = value; }

}

publicbool Adj_noun

{

get { return _adj_noun; }

set { _adj_noun = value; }

}

publicstring Result

{

get { return _result; }

set { _result = value; }

}

publicint Counter

{

get { return _counter; }

set { _counter = value; }

}

publicdouble Tf_Idf

{

get { return _tf_idf; }

set { _tf_idf = value; }

}

publicint Idf

{

get { return _idf; }

set { _idf = value; }

}

// Метод для добавления одного слова или нераспознанных слов и фраз

public KeyPhrase(bool unknown, string text, bool oneWord)

{

this.OneWord = oneWord;

this.Unknown = unknown;

this.Result = text;

this.Counter = 1;

if (!this.Unknown)

this.OneWord = true;

if (this.Result == null)

{

int t = 10;

}

}

// Метод для добавления ключевой фразы

public KeyPhrase(string firstWord, WordStructure firstStruct, string secondWord, WordStructure secondStruct, bool adj_noun)

{

this.OneWord = false;

this.Adj_noun = adj_noun;

this.Counter = 1;

if (this.Adj_noun)//прилагательноеисущ

{

if ((firstStruct.sexOfSpeech.Contains(Grammems.Male) ||

firstStruct.sexOfSpeech.Contains(Grammems.Full)) &&

secondStruct.sexOfSpeech.Contains(Grammems.Male))

{

this.Result = firstStruct.defaultForm + " " + secondStruct.defaultForm;

this.Best = true;

return;

}

if (firstStruct.countOfSpeech.Contains(Grammems.One) &&

(secondStruct.sexOfSpeech.Contains(Grammems.Female) ||

secondStruct.sexOfSpeech.Contains(Grammems.Middle)) &&

secondStruct.countOfSpeech.Contains(Grammems.One))

{

if (firstStruct.caseOfSpeech.Contains(Grammems.NomCase))

this.Best = true;

this.Result = firstWord + " " + secondWord;

return;

}

if (firstStruct.countOfSpeech.Contains(Grammems.Many) &&

secondStruct.countOfSpeech.Contains(Grammems.Many) &&

(secondStruct.sexOfSpeech.Contains(Grammems.Female) ||

secondStruct.sexOfSpeech.Contains(Grammems.Middle)))

{

if (firstStruct.caseOfSpeech.Contains(Grammems.NomCase))

this.Best = true;

this.Result = firstWord + " " + secondWord;

return;

}

else

{

this.Result = firstWord + " " + secondWord;

}

}

else//сущисущ

{

this.Result = firstStruct.defaultForm + " " + secondWord;

}

if (this.Result == null)

{

int t = 10;

}

}

// Метод для добавления кандидата при обработке корпуса статей

public KeyPhrase(int articleNum)

{

this.articleNum = articleNum;

this.Idf = 1;

}

// Метод для увеличения счетчика при обработке текста

publicvoid Increment(string firstWord, WordStructure firstStruct, string secondWord, WordStructure secondStruct)

{

this.Counter++;

if (this.Adj_noun)//прилагательное и существительное

{

if (firstStruct.countOfSpeech.Contains(Grammems.One) &&

(secondStruct.sexOfSpeech.Contains(Grammems.Female) ||

secondStruct.sexOfSpeech.Contains(Grammems.Middle)) &&

secondStruct.countOfSpeech.Contains(Grammems.One))

{

if (firstStruct.caseOfSpeech.Contains(Grammems.NomCase) && !this.Best)

this.Result = firstWord + " " + secondStruct.defaultForm;

return;

}

if (firstStruct.countOfSpeech.Contains(Grammems.Many) &&

secondStruct.countOfSpeech.Contains(Grammems.Many) &&

(secondStruct.sexOfSpeech.Contains(Grammems.Female) ||

secondStruct.sexOfSpeech.Contains(Grammems.Middle)))

{

if (firstStruct.caseOfSpeech.Contains(Grammems.NomCase) && !this.Best)

this.Result = firstWord + " " + secondWord;

return;

}

}

}

// Метод для увеличения счетчика при обработке корпуса статей

publicvoid Increment(int articleNum)

{

if (this.articleNum != articleNum)

{

this.Idf++;

this.articleNum = articleNum;

}

}

}

SearchResult

publicclassSearchResult

{

string _resType;

string _title;

string _author;

string _url;

publicstring ResType

{

get { return _resType; }

set { _resType = value; }

}

publicstring Title

{

get { return _title; }

set { _title = value; }

}

publicstring Author

{

get { return _author; }

set { _author = value; }

}

publicstring Url

{

get { return _url; }

set { _url = value; }

}

//Раззборхарактеристикдокумента

public SearchResult(HtmlNode node)

{

var header = node.ChildNodes.Where(x => x.Attributes.Contains("class") && x.Attributes["class"].Value == elementsDOM.header).First();

if (header.InnerText.Contains(SearchConsts.PDF))

{

this.ResType = SearchConsts.PDF;

}

elseif (header.InnerText.Contains(SearchConsts.Book))

{

this.ResType = SearchConsts.Book;

}

elseif (header.InnerText.Contains(SearchConsts.Html))

{

this.ResType = SearchConsts.Html;

}

elseif (header.InnerText == SearchConsts.Empty)

{

this.ResType = SearchConsts.Empty;

}

else

{

this.ResType = SearchConsts.Unknown;

}

//названиедокумента

var title = header.ChildNodes.Where(x => x.Name == "a").First();

this.Title = title.InnerText;

//Ссылканарезультат

if (title.Attributes.Contains("href"))

{

this.Url = title.Attributes["href"].Value.Replace("&amp", "&");

}

//Авторииздательство

var author = node.ChildNodes.Where(x => x.Attributes.Contains("class") && x.Attributes["class"].Value == elementsDOM.author).First();

this.Author = author.InnerText;

}

}

TextProcessing

classTextProcessing

{

//извлечение N-грамм

publicstaticvoid ProcessText(Dictionary<string, KeyPhrase> keyPhrases, string[] text)

{

for (int i = 1; i < text.Length; i += 2)

{

if (text[i + 1] == "_")

TwoWords(keyPhrases, text[i] + " " + text[i + 2]);

elseif (text[i - 1] != "_")

OneWord(keyPhrases, text[i]);

}

}

//работасоднимсловом

staticvoid OneWord(Dictionary<string, KeyPhrase> keyPhrases, string expression)

{

var patternDesc = @"\{(.*?)\}";

var matchesDesc = Regex.Matches(expression, patternDesc);

string descr = String.Empty;

foreach (Match m in matchesDesc)

{

descr = m.Groups[1].ToString();

}

string word = expression.Split('{')[0].ToLower(); ;

#region unknown word

if (expression.Contains("??"))//unknown words

{

if (word.Length > 3)

{

if (!keyPhrases.ContainsKey(word))

keyPhrases.Add(

word,

newKeyPhrase(true, word, true)

);

else

keyPhrases[word].Counter++;

}

return;

}

#endregion

WordStructure wordStructure = AnalyzeWord(descr);

if (wordStructure.partOfSpeech == Grammems.Noun)

{

if (wordStructure.defaultForm.Length > 1)

if (!keyPhrases.ContainsKey(wordStructure.defaultForm))

keyPhrases.Add(

wordStructure.defaultForm,

newKeyPhrase(false, wordStructure.defaultForm, true)

);

else

keyPhrases[wordStructure.defaultForm].Counter++;

}

}

//работасфразой

staticvoid TwoWords(Dictionary<string, KeyPhrase> keyPhrases, string expression)

{

string firstExpression = expression.Split(' ')[0];

string firstWord = firstExpression.Split('{')[0].ToLower();

string secondExpression = expression.Split(' ')[1];

string secondWord = secondExpression.Split('{')[0].ToLower();

var patternDesc = @"\{(.*?)\}";

var firstMatchesDesc = Regex.Matches(firstExpression, patternDesc);

var secondMatchesDesc = Regex.Matches(secondExpression, patternDesc);

string firstDescr = String.Empty;

string secondDescr = String.Empty;

foreach (Match m in firstMatchesDesc)

{

firstDescr = m.Groups[1].ToString();

}

foreach (Match m in secondMatchesDesc)

{

secondDescr = m.Groups[1].ToString();

}

#region unknown words

if (firstExpression.Contains("??") && secondExpression.Contains("??"))

{

if (firstWord.Length > 3 && secondWord.Length > 3)

{

if (!keyPhrases.ContainsKey(firstWord + " " + secondWord))

keyPhrases.Add(

firstWord + " " + secondWord,

newKeyPhrase(true, firstWord + " " + secondWord, false)

);

else

keyPhrases[firstWord + " " + secondWord].Counter++;

}

return;

}

if (firstExpression.Contains("??"))

{

OneWord(keyPhrases, firstExpression);

return;

}

if (secondExpression.Contains("??"))

{

OneWord(keyPhrases, secondExpression);

return;

}

#endregion

try

{

WordStructure firstWordStructure = AnalyzeWord(firstDescr);

WordStructure secondWordStructure = AnalyzeWord(secondDescr);

#region noun+noun

if (firstWordStructure.partOfSpeech == Grammems.Noun)

{

OneWord(keyPhrases, firstExpression);

if (secondWordStructure.partOfSpeech == Grammems.Noun &&

secondWordStructure.caseOfSpeech.Contains(Grammems.GenCase))

{

if (firstWord.Length >= 3 && secondWord.Length >= 3)

if (!keyPhrases.ContainsKey(firstWordStructure.defaultForm + " " + secondWordStructure.defaultForm))

keyPhrases.Add(

firstWordStructure.defaultForm + " " + secondWordStructure.defaultForm,

newKeyPhrase(firstWord, firstWordStructure, secondWord, secondWordStructure, false)

);

else

keyPhrases[firstWordStructure.defaultForm + " " + secondWordStructure.defaultForm].Increment(firstWord, firstWordStructure, secondWord, secondWordStructure);

}

}

#endregion

#region adj+noun

if (secondWordStructure.partOfSpeech == Grammems.Noun)

{

OneWord(keyPhrases, secondExpression);

if (firstWordStructure.partOfSpeech == Grammems.Adj)

{

if (firstWord.Length >= 3 && secondWord.Length >= 3)

if (!keyPhrases.ContainsKey(firstWordStructure.defaultForm + " " + secondWordStructure.defaultForm))

keyPhrases.Add(

firstWordStructure.defaultForm + " " + secondWordStructure.defaultForm,

newKeyPhrase(firstWord, firstWordStructure, secondWord, secondWordStructure, true)

);

else

keyPhrases[firstWordStructure.defaultForm + " " + secondWordStructure.defaultForm].Increment(firstWord, firstWordStructure, secondWord, secondWordStructure);

}

}

#endregion

}

catch { }

}

//работа с одним словом при обработке корпуса статей

staticvoid OneWord(Dictionary<string, KeyPhrase> idfPhrases, string expression, int articleNum)

{

var patternDesc = @"\{(.*?)\}";

var matchesDesc = Regex.Matches(expression, patternDesc);

string descr = String.Empty;

foreach (Match m in matchesDesc)

{

descr = m.Groups[1].ToString();

}

string word = expression.Split('{')[0].ToLower(); ;

#region unknown word

if (expression.Contains("??"))//unknown words

{

if (word.Length > 3)

{

if (!idfPhrases.ContainsKey(word))

idfPhrases.Add(

word,

newKeyPhrase(articleNum)

);

else

idfPhrases[word].Increment(articleNum);

}

return;

}

#endregion

try

{

WordStructure wordStructure = AnalyzeWord(descr);

if (wordStructure.partOfSpeech == Grammems.Noun)

{

if (wordStructure.defaultForm.Length > 1)

if (!idfPhrases.ContainsKey(wordStructure.defaultForm))

idfPhrases.Add(

wordStructure.defaultForm,

newKeyPhrase(articleNum)

);

else

idfPhrases[wordStructure.defaultForm].Increment(articleNum);

}

}

catch { }

}

//работа с фразой при обработке корпуса статей

staticvoid TwoWords(Dictionary<string, KeyPhrase> idfPhrases, string expression, int articleNum)

{

string firstExpression = expression.Split(' ')[0];

string firstWord = firstExpression.Split('{')[0].ToLower();

string secondExpression = expression.Split(' ')[1];

string secondWord = secondExpression.Split('{')[0].ToLower();

var patternDesc = @"\{(.*?)\}";

var firstMatchesDesc = Regex.Matches(firstExpression, patternDesc);

var secondMatchesDesc = Regex.Matches(secondExpression, patternDesc);

string firstDescr = String.Empty;

string secondDescr = String.Empty;

foreach (Match m in firstMatchesDesc)

{

firstDescr = m.Groups[1].ToString();

}

foreach (Match m in secondMatchesDesc)

{

secondDescr = m.Groups[1].ToString();

}

#region unknown words

if (firstExpression.Contains("??") && secondExpression.Contains("??"))

{

if (firstWord.Length > 3 && secondWord.Length > 3)

{

if (!idfPhrases.ContainsKey(firstWord + " " + secondWord))

idfPhrases.Add(

firstWord + " " + secondWord,

newKeyPhrase(articleNum)

);

else

idfPhrases[firstWord + " " + secondWord].Increment(articleNum);

}

return;

}

if (firstExpression.Contains("??"))

{

OneWord(idfPhrases, firstExpression, articleNum);

return;

}

if (secondExpression.Contains("??"))

{

OneWord(idfPhrases, secondExpression, articleNum);

return;

}

#endregion

WordStructure firstWordStructure = AnalyzeWord(firstDescr);

WordStructure secondWordStructure = AnalyzeWord(secondDescr);

#region noun+noun

if (firstWordStructure.partOfSpeech == Grammems.Noun)

{

OneWord(idfPhrases, firstExpression, articleNum);

if (secondWordStructure.partOfSpeech == Grammems.Noun &&

secondWordStructure.caseOfSpeech.Contains(Grammems.GenCase))

{

if (firstWord.Length >= 3 && secondWord.Length >= 3)

if (!idfPhrases.ContainsKey(firstWordStructure.defaultForm + " " + secondWordStructure.defaultForm))

idfPhrases.Add(

firstWordStructure.defaultForm + " " + secondWordStructure.defaultForm,

newKeyPhrase(articleNum)

);

else

idfPhrases[firstWordStructure.defaultForm + " " + secondWordStructure.defaultForm].Increment(articleNum);

}

}

#endregion

#region adj+noun

if (secondWordStructure.partOfSpeech == Grammems.Noun)

{

OneWord(idfPhrases, secondExpression, articleNum);

if (firstWordStructure.partOfSpeech == Grammems.Adj)

{

if (firstWord.Length >= 3 && secondWord.Length >= 3)

if (!idfPhrases.ContainsKey(firstWordStructure.defaultForm + " " + secondWordStructure.defaultForm))

idfPhrases.Add(

firstWordStructure.defaultForm + " " + secondWordStructure.defaultForm,

newKeyPhrase(articleNum)

);

else

idfPhrases[firstWordStructure.defaultForm + " " + secondWordStructure.defaultForm].Increment(articleNum);

}

}

#endregion

}

//анализ слова по результатам морфологического анализатора

staticWordStructure AnalyzeWord(string word)

{

try

{

WordStructure result = newWordStructure();

result.defaultForm = word.Split('=')[0];

string temp = word.Split('=')[1];

result.partOfSpeech = temp.Split(',')[0];

string[] descriptions = word.Split('|');

if (result.partOfSpeech == Grammems.Noun)

{

foreach (string description in descriptions)

{

string[] parts = description.Split('=');

result.sexOfSpeech.Add(parts[1].Split(',')[1]);

result.caseOfSpeech.Add(parts[2].Split(',')[0]);

if (result.sexOfSpeech[result.sexOfSpeech.Count - 1] == Grammems.Male ||

result.sexOfSpeech[result.sexOfSpeech.Count - 1] == Grammems.Female ||

result.sexOfSpeech[result.sexOfSpeech.Count - 1] == Grammems.Middle)

result.countOfSpeech.Add(parts[2].Split(',')[1]);

else

result.countOfSpeech.Add("");

}

}

if (result.partOfSpeech == Grammems.Adj)

{

foreach (string description in descriptions)

{

string[] parts = description.Split('=');

if (parts[2].Split(',').Length > 1)

{

result.caseOfSpeech.Add(parts[2].Split(',')[0]);

result.countOfSpeech.Add(parts[2].Split(',')[1]);

if (result.countOfSpeech[result.countOfSpeech.Count - 1] == Grammems.One)

result.sexOfSpeech.Add(parts[2].Split(',')[2]);

else

result.sexOfSpeech.Add("");

}

}

}

return result;

}

catch

{

WordStructure result = newWordStructure();

result.partOfSpeech = "";

return result;

}

}

publicstaticvoid ProcessArticles(Dictionary<string, KeyPhrase> idfPhrases, string[] text, int articleNum)

{

for (int i = 1; i < text.Length; i += 2)

{

if (text[i + 1] == "_")

TwoWords(idfPhrases, text[i] + " " + text[i + 2], articleNum);

elseif (text[i - 1] != "_")

OneWord(idfPhrases, text[i], articleNum);

}

}

//расчет TF-IDF

publicstaticvoid CalculateTFIDF(Dictionary<string, int> weights, Dictionary<string, KeyPhrase> keyPhrases, int articleNum, int wordCount)

{

foreach (KeyValuePair<string, KeyPhrase> keyPhrase in keyPhrases)

{

double idf;

if (weights.ContainsKey(keyPhrase.Key))

{

idf = Math.Log10((double)articleNum / weights[keyPhrase.Key]);

}

else

{

idf = Math.Log10((double)articleNum / 1);

}

double tf = (double)keyPhrase.Value.Counter / wordCount;

keyPhrases[keyPhrase.Key].Tf_Idf = tf * idf;

}

}

//корректировка коэффициентов с учетом вложенности слов

publicstaticvoid WordNesting(Dictionary<string, KeyPhrase> keyPhrases, Dictionary<string, KeyPhrase> result)

{

foreach (KeyValuePair<string, KeyPhrase> phrase in keyPhrases)

{

if (phrase.Value.OneWord)

{

bool delete = false;

var phrases = keyPhrases.Select(x => x).Where(x => x.Value.OneWord == false&&Regex.IsMatch(x.Key, "\\b" + phrase.Key + "\\b"));

foreach (KeyValuePair<string, KeyPhrase> ph in phrases)

{

if ((phrase.Value.Tf_Idf / ph.Value.Tf_Idf) < 10)//??????

delete = true;

}

if (!delete)

result.Add(phrase.Key, phrase.Value);

}

else

result.Add(phrase.Key, phrase.Value);

}

}

//запуск Mystem

publicstaticstring[] RunMyStem(string fileName)

{

Process p = newProcess();

p.StartInfo.UseShellExecute = false;

p.StartInfo.RedirectStandardOutput = true;

p.StartInfo.FileName = "mystem.exe";

p.StartInfo.Arguments = "-cdni " + fileName;//cdni

p.StartInfo.CreateNoWindow = true;

p.Start();

string[] allLines;

using (var reader = newStreamReader(p.StandardOutput.BaseStream, Encoding.UTF8))

{

allLines = reader.ReadToEnd().Split(newstring[] { "\r\n" }, StringSplitOptions.None);

}

p.WaitForExit();

return allLines;

}

}

SearchProcessing

classSearchProcessing

{

//осуществление GET запроса

publicstaticstring GetPageHtml(string link, System.Net.WebProxy proxy, int index, string keyWords, string lang, string as_vis)

{

WebClient client = newWebClient();

client.QueryString.Add("start", index.ToString());

client.QueryString.Add("q", keyWords);

client.QueryString.Add("hl", lang);

client.QueryString.Add("as_vis", as_vis);

if (proxy != null)

{

client.Proxy = proxy;

}

using (client)

{

try

{

return client.DownloadString(link);

}

catch (Exception ex)

{

returnnull;

}

}

}

//обработкавсехрезультатов

publicstaticvoid SendRequest(string keyWords, List<SearchResult> searchResults)

{

keyWords = HttpUtility.UrlEncode(keyWords);

List<HtmlNode> results = newList<HtmlNode>();

List<HtmlNode> tempResult = newList<HtmlNode>();

for (int i = 0; i < 100; i += 10)

{

string url = "https://scholar.google.ru/scholar";

var Html = GetPageHtml(url, null, i, keyWords, "ru", "1");

if (Html != null)

{

HtmlDocument html = newHtmlDocument();

html.LoadHtml(Html);

tempResult = html.GetElementbyId(elementsDOM.content).ChildNodes.Where(x => x.Attributes.Contains("class") && x.Attributes["class"].Value == elementsDOM.element).ToList();

results.AddRange(tempResult);

}

Thread.Sleep(TimeSpan.FromSeconds(3));

}

parseResults(results, searchResults);

}

//парсингстраницы

staticvoid parseResults(List<HtmlNode> queryResults, List<SearchResult> searchResults)

{

foreach (HtmlNode node in queryResults)

{

HtmlNode nodeText = node.ChildNodes.Where(x => x.Attributes.Contains("class") && x.Attributes["class"].Value == elementsDOM.elementRes).First();

SearchResult result = newSearchResult(nodeText);

searchResults.Add(result);

}

}

}

MainForm

//запускизвлеченияключевыхслов

privatevoid KeywordsExtraction()

{

newThread(() =>

{

Thread.CurrentThread.IsBackground = false;

extractedKeyPhrases = newDictionary<string, KeyPhrase>();

resultKeyPhrases = newDictionary<string, KeyPhrase>();

string file = "input.txt";

string[] allLines = TextProcessing.RunMyStem(file);

TextProcessing.ProcessText(extractedKeyPhrases, allLines);

idfWeights = newDictionary<string, int>();

int articleNum = ReadWeights(idfWeights);

int wordCount = (int)(allLines.Length / 2);

TextProcessing.CalculateTFIDF(idfWeights, extractedKeyPhrases, articleNum, wordCount);

TextProcessing.WordNesting(extractedKeyPhrases, resultKeyPhrases);

Invoke(renderKW);//выводрезультатов

}).Start();

}

//запускпоисковогозапроса

publicvoid SearchArticles(string keyWords)

{

ps_Main.Visible = true;

ps_Main.Spinning = true;

searchResults = newList<SearchResult>();

newThread(() =>

{

SearchProcessing.SendRequest(keyWords, searchResults);

Invoke(renderSR);//выводрезультатов

}).Start();

}

//чтениекоэффициентов DF

privateint ReadWeights(Dictionary<string, int> idfWeights)

{

string[] weights = File.ReadAllLines("weights.txt", Encoding.Default);

int articleNum = int.Parse(weights[0]);

for (int i = 1; i < weights.Length; i++)

{

string word = weights[i].Split('|')[0];

int wordWeight = int.Parse(weights[i].Split('|')[1]);

if (!idfWeights.ContainsKey(word))

idfWeights.Add(word, wordWeight);

}

return articleNum;

}

Размещено на Allbest.ru


Подобные документы

  • Исследование основных концепций информационного поиска: булева и векторная модели, индексные термины. Реализация векторной модели в среде Matlab, расчет ранжированных списков документов, реализация оценок качества поиска и листинг программы в Matlab.

    отчет по практике [444,8 K], добавлен 17.06.2012

  • Создание и развитие университетской информационной системы как тематической электронной библиотеки и базы для исследований и учебных курсов. Общее описание системы. Пользовательский графический интерфейс. Программное обеспечение, руководство пользователя.

    дипломная работа [1,0 M], добавлен 24.01.2016

  • Анализ предметной области. Обеспечение качества проектной документации. Построение инфологической (концептуальной) модели предметной области. Проектирование физической структуры базы данных. Разработка интерфейса, организация ввода и поиска данных.

    курсовая работа [2,5 M], добавлен 10.01.2016

  • Рассмотрение предметной области учета операций с недвижимостью. Определение проблем и разработка концепции информационной системы. Формирование таблицы документов и разработка форм входных и выходных документов в среде программирования C++ Builder.

    курсовая работа [2,0 M], добавлен 20.01.2015

  • Анализ существующих поисковых систем и используемых ими алгоритмов поиска документов. Разработка информационно-поисковой системы словарного типа, способной осуществлять релевантный поиск документов, особенности ее структуры и информационно-поисковой базы.

    дипломная работа [942,1 K], добавлен 19.05.2011

  • Изучение классификации поисковых средств по В.В. Дудихину. Поиск информации с помощью поисковых ресурсов. Формирование запросов. Использование ключевых слов. Индексация документов, размещенных на различных серверах. Зарубежные лидеры поисковых систем.

    презентация [775,3 K], добавлен 10.03.2015

  • Описание алгоритмов поиска пути. Диаграмма объектов предметной области. Разработка структурной схемы. Проектирование интерфейса пользователя. Выбор и обоснование комплекса программных средств. Разработка пользовательского меню. Диаграмма компонентов.

    курсовая работа [3,5 M], добавлен 10.04.2015

  • Роль классификации документов в решении задач информационного поиска. Методы автоматической классификации документов и этапы построения классифицирующей системы: индексация документа, построение классификаторов на базе обучающих данных, оценка их работы.

    курсовая работа [354,2 K], добавлен 13.01.2013

  • Обоснование выбора языка программирования. Описание разработки структуры программы. Спецификация переменных и процедур. Руководство оператора, словесный алгоритм. Состав информационной системы поиска квартир и характеристика её программных интерфейсов.

    отчет по практике [2,2 M], добавлен 15.09.2014

  • Обзор существующих систем атоматизированного поиска. Мир электронных денег. Разработка структуры системы автоматизированного поиска отделений и терминалов банков. Обоснование выбора технологии разработки, программной среды и языка программирования.

    курсовая работа [1,2 M], добавлен 17.01.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.