Нужно решить такую задачку: "Анализ вводимого текста"
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Нужно решить такую задачку: "Анализ вводимого... Expand / Collapse
Автор
Сообщение
08.07.2007 14:36
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 07.08.2007 22:34
Сообщ.: 9, Visits: 57
Очень нужно составить прогу, которая умела бы опознавать (различать), где какие слова в предложении:

существительные, глаголы, прилагательные, предлоги, местоимения и прочее.

Например, есть фраза: "Петя пошел в школу в семь утра". Надо, чтобы прога проанализировала это предложение и выдала:

Петя - существительное;

пошел - глагол;

в - предлог ... и так далее.

Базы для каждых из частей речи (как эталоны) имеются в Аксесс. Но если потребуется как-то иначе, то можно составить новые или переформатировать старые базы. 

Сам проект проги желательно в Visual Studio на Basice.

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

Сообщ. #914580
09.07.2007 13:53
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 16.04.2008 11:44
Сообщ.: 366, Visits: 2 473
С точки зрения разработки задача простая.
1. отделить в цикле каждое слово, предполагая, что разделитель пробел.
2. определить корень слова используя семантический анализ
3. выбрать из таблицы по корню признак слова (существительное, глагол, предлог и т д).
Ключевая проблема выделена цветом :) И это вопрос скорее к филологам, а не программистам.
Думаю, здесь нужно обратиться к http://www.google.ru/search?q=%D1%84%D0%BE%D1%80%D1%83%D0%BC+%D1%84%D0%B8%D0%BB%D0%BE%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox-a

С уважением,
Сообщ. #914586
09.07.2007 22:22
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 07.08.2007 22:34
Сообщ.: 9, Visits: 57
babken76 (09.07.2007)
С точки зрения разработки задача простая.
1. отделить в цикле каждое слово, предполагая, что разделитель пробел.

С уважением,

Вот в том-то и дело, что "отделить в цикле каждое слово" не получается. Теоретически алгоритм понятен: надо считать словами слитные последовательности символов, ограниченных либо пробелом, либо каким-то знаком прпинания. Но напрактике не получается.

Не могли бы Вы помочь в составлении кода для этой части проги?

С наилучшими пожеланиями,

Сообщ. #914599
10.07.2007 8:37


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 15.03.2008 7:33
Сообщ.: 1 329, Visits: 15 053
Воспользуйтесь стандартной функцией Split, выдающий массив подстрок из строки, разбитой по разделителю.
Сообщ. #914602
10.07.2007 15:31
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 16.04.2008 11:44
Сообщ.: 366, Visits: 2 473
Вот в том-то и дело, что "отделить в цикле каждое слово" не получается. Теоретически алгоритм понятен: надо считать словами слитные последовательности символов, ограниченных либо пробелом, либо каким-то знаком прпинания. Но напрактике не получается.

Как вариант:

Sub hg()

Dim f As String, g As Integer, n As Integer
Dim curr_word(256) As Variant

f = textbox1.Value
Do
g = InStr(1, f, " ", vbTextCompare)
If g = 0 Then
curr_word(n) = f
Exit Sub
End If
curr_word(n) = Left(f, g - 1)
n = n + 1
f = Right(f, Len(f) - g)
Loop Until g = 0
End Sub

На выходе получаете одномерный массив curr_word слов.

С уважением,
Сообщ. #914617
10.07.2007 16:54
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Для семантического анализа можно использовать парсер mystem от Яndex'a.
Сообщ. #914622
10.07.2007 22:23
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 07.08.2007 22:34
Сообщ.: 9, Visits: 57
pl (10.07.2007)
Воспользуйтесь стандартной функцией Split, выдающий массив подстрок из строки, разбитой по разделителю.

Рад бы это сделать, да не могу.

Вот какой алгоритм мне думалось использовать.

Пусть имеется, например, текст:

Петя пошел в среднюю школу №3 с семи лет. А мама пошла на работу в шесть утра, когда папа вернулся со смены домой.

 

Шаг 1.

Все символы текста, отличные от А до Я и от а до я и от 0 до 9 , заменить на знак «ПРОБЕЛ».

Шаг 2.

Добавить к началу текста знак «ПРОБЕЛ».

Шаг 3.

Заменить все двойные «ПРОБЕЛЫ» на одинарные.

Шаг 4.

Выделить последовательность символов (слово), заключенных между двумя «ПРОБЕЛАМИ».

Шаг 5.

Каждое выделенное слово индексируется и помещается в Базу Данных.

Шаг 6.

Слова полученные из текста  последовательно сравниваются со словами, имеющимися в БД, и они идентифицируются как Существительные, глаголы и прочее.

Сообщ. #914638
10.07.2007 22:32
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 07.08.2007 22:34
Сообщ.: 9, Visits: 57
babken76 (10.07.2007)

Как вариант:



Sub hg()

Dim f As String, g As Integer, n As Integer
Dim curr_word(256) As Variant

f = textbox1.Value
Do
g = InStr(1, f, " ", vbTextCompare)
If g = 0 Then
curr_word(n) = f
Exit Sub
End If
curr_word(n) = Left(f, g - 1)
n = n + 1
f = Right(f, Len(f) - g)
Loop Until g = 0
End Sub

На выходе получаете одномерный массив curr_word слов.

С уважением,

Уважаемый babken76!

Во-первых, спасибо что откликнулись.

Ну, а во-вторых, у меня что-то не получается. 

Здесь есть три момента когда мой debag ругается:

1. f = textbox1.Value - здесь он говорит: "Value" не является членом "System.Windows.Forms.TextBox"

2. "Public Property Left() As Integer" не имеет параметров, поэтому невозможно проиндексировать его возвращаемый тип. 

3. "Public ReadOnly Property Right() As Integer" не имеет параметров, поэтому невозможно проиндексировать его возвращаемый тип. 

КАК БЫТЬ?

Сообщ. #914639