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

  • Автор темы Akiko
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

Akiko

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

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

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

Pasha

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