Алгоритм разбивки слов по правилам переноса (упрощенный)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
-=TsA=-
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 21.09.2004 (Вт) 14:32
Откуда: Татарстан, Заинск

Алгоритм разбивки слов по правилам переноса (упрощенный)

Сообщение -=TsA=- » 22.04.2009 (Ср) 7:18

В алгоритме не используется морфологический анализ слов или словарь, поэтому не всегда правильно переносятся многокоренные и сложные слова, аббревиатуры не распознаются :? . В общем виде правильно разбивается около 95-98% слов, что является очень неплохим результатом. :roll:
Выложу примерчик может кому пригодится.

Использование:
Text = SplitWord(Text)

Параметры:
Техт - Слово с прилегающими знаками припинания (если есть)

Результат: Слово разделенное знаками переноса

Код: Выделить всё
Option Explicit

Public Function SplitWord(ByVal Text As String) As String
    Dim I As Integer, J As Integer, B As Integer, E As Integer
    Dim Bs As String, Es As String
    Dim S() As String
    'разбиваемое слово должно быть длинее 3 символов
    If Len(Text) > 3 Then
        'Отделяем знаки припенания скобки, кавычки и тд.
        For B = 1 To Len(Text)
            If Asc(Mid(Text, B, 1)) > &HBF Then
                Exit For
            End If
        Next B
        For E = Len(Text) To 1 Step -1
            If Asc(Mid(Text, E, 1)) > &HBF Then
                Exit For
            End If
        Next E
        If E > B Then
            If B > 0 Then
                Bs = Left(Text, B - 1)
            End If
            If E < Len(Text) Then
                Es = Right(Text, Len(Text) - E)
            End If
            Text = Mid(Text, B, E - B + 1)
        End If
        'Снова проверяем длину слова
        If Len(Text) > 3 Then
            'Размечаем гласные буквы
            Text = Replace(Text, "А", "А¤")
            Text = Replace(Text, "а", "а¤")
            Text = Replace(Text, "Е", "Е¤")
            Text = Replace(Text, "е", "е¤")
            Text = Replace(Text, "И", "И¤")
            Text = Replace(Text, "и", "и¤")
            Text = Replace(Text, "О", "О¤")
            Text = Replace(Text, "о", "о¤")
            Text = Replace(Text, "У", "У¤")
            Text = Replace(Text, "у", "у¤")
            Text = Replace(Text, "Ы", "Ы¤")
            Text = Replace(Text, "ы", "ы¤")
            Text = Replace(Text, "Э", "Э¤")
            Text = Replace(Text, "э", "э¤")
            Text = Replace(Text, "Ю", "Ю¤")
            Text = Replace(Text, "ю", "ю¤")
            Text = Replace(Text, "Я", "Я¤")
            Text = Replace(Text, "я", "я¤")
            S = Split(Text, "¤")
            If UBound(S) > 0 Then
                For I = 1 To UBound(S) - 1
                    'Удвоенные согласные, для легкого чтения рекомендуется разбивать
                    For J = 1 To Len(S(I)) - 1
                        If Mid(S(I), J, 1) = Mid(S(I), J + 1, 1) Then
                            S(I) = Replace(S(I), Mid(S(I), J, 1) & Mid(S(I), J + 1, 1), Mid(S(I), J, 1) & "-" & Mid(S(I), J + 1, 1))
                            Exit For
                        End If
                    Next J
                    'Распределяем по слогам
                    If InStr(S(I), "-") = 0 Then
                        J = Int((Len(S(I)) - 1) / 2)
                        S(I) = Left(S(I), J) & "-" & Mid(S(I), J + 1)
                    End If
                Next I
                'Переразбиваем слово с учетом предыдущих правил
                Text = Join(S, "")
                S = Split(Text, "-")
                'Буквы Й, Ы, Ъ, Ь нельзя отделять от предшествующей буквы
                For I = 1 To UBound(S)
                    If InStr("ЙЫЪЬ", UCase(Left(S(I), 1))) > 0 Then
                        S(I - 1) = S(I - 1) & Left(S(I), 1)
                        S(I) = Mid(S(I), 2)
                    End If
                Next I
                'Нельзя оставлять на предыдущей строке или переносить на следующую строку одну букву слова
                If Len(S(0)) < 2 Then
                    S(0) = S(0) & S(1)
                    S(1) = ""
                End If
                If Len(S(UBound(S))) < 2 Then
                    S(UBound(S) - 1) = S(UBound(S) - 1) & S(UBound(S))
                    S(UBound(S)) = ""
                    ReDim Preserve S(UBound(S) - 1)
                End If
                'Собираем слово
                Text = Join(S, "-")
                'Делаем чистку
                Text = Replace(Text, "--", "-")
            End If
        End If
        'Возращаем знаки припенания и скобки
        Text = Bs & Text & Es
    End If
    SplitWord = Text
End Function


Изображение Изображение
Вложения
SplitWords.zip
2 примера использования
(28.13 Кб) Скачиваний: 44
Последний раз редактировалось -=TsA=- 23.04.2009 (Чт) 9:33, всего редактировалось 3 раз(а).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Алгоритм разбивки слов по правилам переноса (упрощенный)

Сообщение Хакер » 22.04.2009 (Ср) 13:12

Это не кирпич. Доведи до ума. Перенесу обратно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

-=TsA=-
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 21.09.2004 (Вт) 14:32
Откуда: Татарстан, Заинск

Re: Алгоритм разбивки слов по правилам переноса (упрощенный)

Сообщение -=TsA=- » 23.04.2009 (Чт) 9:25

Так пойдет?


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 39

    TopList  
cron