Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C#] Поиск глаголов по тексту 
:(
    Опции темы
Akiko
  Дата 11.6.2007, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 11.6.2007

Репутация: нет
Всего: нет



Здравствуйте.
Заранее прошу прощения, если подобной просьбой нарушаю правила форума или пишу не в ту тему, потому как, если в общем, она будет звучать где-то как «напишите мне, пожалуйста, кусок программы». 
Проблема в том, что мне на диплом нужно написать программу для автоматического анализа и синтеза определенной формы глагола. С теоретической разработкой все нормально, а вот код программы написать категорически не умею...  smile 
 Программа должна в тексте, вставленном в Textbox, находить слова, которые находятся в базе данных. Потом эти выделенные слова проверять на определенное окружение, и, уже в зависимости от него, выдавать результат.
Если я правильно понимаю, сначала нужно удалить из текста знаки препинания и сделать каждое слово отдельной строкой (разбить текст на массив строк). Затем уже каждую строку сравнивать со строками в базе данных. В результате программа должна выделить как-то совпавшие слова. Но это должен быть только промежуточный этап...
Затем нужно, чтобы проверялось окружение выделенных слов. Что-то вроде: если первое слово перед найденным находится в базе данных А, то в результате оно выделяется (скажем, цветом), а если первое слово перед найденным находится в базе С, то найденное слово не выделяется.
Получается, что каждый раз, когда очередное слово в тексте совпадает со списком из базы, проверяется его окружение. Тут я вообще теряюсь... как делать эту проверку? 
В результате должно получаться что-то вроде:
I sat on the bank listening to the running of the water and the rustling of the leaves.
Выделяются только running и rustling, потому что из форм глагола с инговым окончанием нужно выбрать только те, которые выступают в роли Verbal Noun.

Пошаговое описание всего этого процесса примерно такое:
1) В Texbox водится текст;
2) Текст проверяется посимвольно, если символы -  , . ? ! « “ : ; ... % - они удаляются;
(в принципе могут встретиться и другие символы какие-то, но в художественном тексте это маловероятно)
3) Снова с начала текста программа идет до первого пробела, затем вырезает часть текста до пробела и делает эту часть отдельной строкой.
4) Таким образом, весь текст разделяется на массив строк.
Вот тут возник вопрос. Возможно, стоит сразу делать базу данных, в которой каждое слово будет в отдельной строке и иметь свой номер?
Мы в университете похожее делали таким образом:

Код

string txt; 
            txt=TextBox1.Text+" ";
            int i=0,wstr=0, l=0;
            for(i=0;i<txt.Length;i=i+1)
            {
                if (txt[i] =='.' || txt[i] == ',' || txt[i] == '!' || 
                    txt[i] == '?' || txt[i] == ':' || txt[i] == ';' || 
                    txt[i] == '"' || txt[i] == '(' || 
                    txt[i] ==')' || txt[i] == '/' || txt[i] ==' ') 
                    
                {
                    if (i!=wstr)
                    {
                    
                        string tmpwrd = txt.Substring(wstr, i-wstr);
                        OleDbConnection connect = new OleDbConnection(ConfigurationSettings.AppSettings["MyDB"]);
                        OleDbCommand comm = new OleDbCommand ("insert into Slovopokazhchyk (Slovo,Num_rech) select '"+ tmpwrd.Replace("'","''") +"', "+l.ToString(), connect);
                        connect.Open();
                        comm.ExecuteNonQuery();
                        

                            connect.Close();
                        
                        
                        }
                         if (txt[i]!=' ')
                        {
                            string tmpwrd = txt.Substring(wstr, i-wstr);
                            OleDbConnection connect = new OleDbConnection(ConfigurationSettings.AppSettings["MyDB"]);
                            OleDbCommand comm = new OleDbCommand ("insert into Slovopokazhchyk (Slovo,Num_rech) select '"+ txt[i].ToString() +"',"+l.ToString(),connect);
                            connect.Open();
                            comm.ExecuteNonQuery();
                            connect.Close();
                        }


Не уверена только, что в данном случае оно подойдет.
5) Берем строку из массива и сравниваем с записями базы данных 1;
(как в данном случае должно иди сравнение, я, к своему стыду, даже не представляю)
6) Проверяем, совпадает ли слово (строка) с каким-то из базы;
7) Если да, переходим к шагу 8, если нет – 18;
8) Берем следующий после выделенного элемент в массиве (скажем, выделенный элемент – k, берем k+1);
Может быть, тут и будет удобнее, если массив слов будет в базе данных с пронумерованными пунктами.
9) Проверяем, есть ли этот элемент в базе данных 2;
10) Если есть, выделяем слово k, если нет, переходим к шагу 11;
11) Берем элемент, предшествующий выделенному слову (k-1);
12) Проверяем, есть ли это элемент в базе данных 3;
(Идет проверка по разным бд, потому что выделенное слово – это глагол в определенной форме, в данном случае – в форме Past Participle. Список глаголов в этой форме в первой базе данных, таким образом идет их поиск в тексте. Но глаголы в такой же форме функционируют и как, скажем, Past Indefinite, когда это регулярные глаголы. Поэтому дальше проверяем их окружение. По окружению можно определить, функционирует ли в данном контексту глагол как Past Participle или нет)
13) Если нет, пропускаем это слово и переходим к шагу 18;
14) Если есть, то выделяем 5 элементов перед выделенным словом (с k-6 до k-1);
15) Проверяем, совпадает ли какой-то из выделенных элементов со словом has/have/had;
(Тут я не знаю, можно ли вообще так делать – сравнивать с конкретным словом. И можно ли сравнивать в одном шаге со всеми тремя? Или лучше сделать для этого отдельные шаги? Или просто сделать маленькую базу данных, и сравнивать с ней поочередно k-2, k-3 и т. д.);
16) Если совпадает, то пропускаем слово и переходим к шагу 18;
17) Если нет, то выделяем слово, и переходим к шагу 18;
18) Проверяем, не последняя ли строка (фактически, есть ли что еще проверять);
19) Если нет, переходим к шагу 5 (сравниваем следующую строку);
20) Если да, выводим результат (Можно, чтобы просто в Textbox появлялось выделение слов?)

Помогите, пожалуйста, написать код! smile 

Это сообщение отредактировал(а) Akiko - 12.6.2007, 17:08
PM MAIL   Вверх
Stepan_Lameroff
Дата 12.6.2007, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 16.12.2006

Репутация: нет
Всего: 14



Посмотрите WordNet - CPP
или 
WordNet.Net - CSHARP

Также можно попытаться задать этот вопрос на этом форуме (CPP).

Разработчика зовут Илья Козиев - очень приятный и отзывчивый человек.
Я думаю, может помочь.
PM MAIL   Вверх
Akiko
Дата 12.6.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 11.6.2007

Репутация: нет
Всего: нет



Спасибо   smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0732 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.