Поиск глаголов в тексте (c#)

Тема в разделе ".NET", создана пользователем Akiko, 12 июн 2007.

Статус темы:
Закрыта.
  1. Akiko

    Akiko Гость

    Помогите, пожалуйста, написать на C# программу следующего содержания. Моя проблема в том, что учусь на прикладной лингвистике, но программировать не умею :) клинически... Вот и выходит, что для работ могу с теоретической базой разобраться, какой-то алгоритм написать (хотя скорее пошаговое описание работы проги), а сам код - никак :)
    Программа должна искать в тексте определенные формы глагола и анализировать их.

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

    Код (Text):
    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 появлялось выделение слов?)

    Буду очень благдарна, если мне кто-то поможет.
     
  2. Pasha

    Pasha Гость

    Для: Akiko
    Держи бонус:
    2) Текст проверяется посимвольно, если символы - , . ? ! « “ : ; ... % - они удаляются;
    Код (Text):
    text = System.Text.RegularExpressions.Regex.Replace(text, @"[^\w\s]", String.Empty);
    3) Снова с начала текста программа идет до первого пробела, затем вырезает часть текста до пробела и делает эту часть отдельной строкой.
    4) Таким образом, весь текст разделяется на массив строк.
    Код (Text):
    string [] words = System.Text.RegularExpressions.Regex.Split(text, @"\s+");
    Все остальное аккуратно переписывается в C#, с заменой слов "Если ... если нет" на "if { ... } else { ... }".
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей