Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443

Как наиболее рационально подойти к разбиению очень большого текста на отдельные слова?

08.07.2020, 18:51. Показов 3866. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте!

Задумал написать на Визуальном бейсике программу, которая будет обрабатывать большие (ну очень большие!) тексты, разбивая их на отдельные слова. На ум приходит только такой подход к решению этой задачи:

1. В цикле проходим по всем словам текста, отправляя каждое из них во вложенный цикл.
2. Во вложенном цикле создаём 2 связанных между собой массива - массив (базу данных) всех найденных слов и массив счётчиков количества повторений для каждого слова.

3. Если найденное слово новое, тогда добавляем его в нашу базу данных со значением счётчика, равным единице.
Если найденное слово уже встречалось, тогда НЕ добавляем его в базу данных, но значение его счётчика увеличиваем на единицу.
Ну а уже в самом конце сортируем нашу базу данных (массив) по алфавиту.

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

И ведь, наверняка же, оптимальный подход к этой задаче уже давно разработан, поскольку уж очень она вроде бы стандартная.
Но я не могу найти. Даже не могу сформулировать строку поиска

Пытался гуглить "VB6 разбить текст на отдельные слова", но там все ответы либо на VB.Net, либо вообще на других языках.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.07.2020, 18:51
Ответы с готовыми решениями:

Как рационально подойти к сокращению и упрощению кода?
Добрый день! Прошу подсказать новичку как рационально подойти к сокращению и упрощению (приведение к компактности) в данном ниже...

Как наиболее рационально обратиться к элементам динамического массива через цикл For
Здравствуйте, подскажите пожалуйста, как наиболее рационально обратиться к элементам динамического массива через цикл For? Есть вот такой...

Как наиболее рационально проверять и устанавливать события из разных потоков? (про атомарность)
Привет! Догадываюсь, что события, точнее их хэндлы, созданные по средствам CreateEvent, не относятся к данным, операции над которыми могут...

49
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
10.07.2020, 20:59  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от The trick Посмотреть сообщение
Цитата Сообщение от Power_Basic
Накопленная база слов будет неуклонно расти, и поиск по ней будет отнимать у процессора всё больше и больше времени.
Это не имеет значения. Разбор 1000000 слов и разбор 1000020 слов, по времени будет практически идентичен.
Но это же практически одна и та же цифра!

1000000
1000020
Хорошо бы сравнить скорость обработки, например, тысячи слов с миллионом.

Цитата Сообщение от The trick Посмотреть сообщение
Да много как можно сделать. Только для текущей задачи это не имеет значения - объемы данных не те.
Ну это как сказать
У меня сейчас наполеоновские планы и соответствующие аппетиты

Добавлено через 2 минуты
Цитата Сообщение от The trick Посмотреть сообщение
Power_Basic, посмотри эту простейшую реализацию хеш-таблицы.
Спасибо, нашёл, буду вникать.

Добавлено через 10 минут
Цитата Сообщение от The trick Посмотреть сообщение
Используй dumpbin и просто перечисляй все экспортированные функции из нужных либ.
Даже пришлось гуглить, что это такое

Справочник DUMPBIN
Microsoft COFF двоичный файл dumper (DUMPBIN. EXE) отображает информацию о двоичных файлах Common Object File Format (COFF). DumpBIN можно использовать для изучения файлов объектов COFF, стандартных библиотек объектов COFF, исполняемых файлов и библиотек динамической ссылки (DLL).
Какие-то двоичные файлы... А мне нужны текстовые. Или это такой компонент, который надо как-то через Reference добавлять?
0
bite
 Аватар для I can
5011 / 4841 / 852
Регистрация: 13.04.2015
Сообщений: 10,123
10.07.2020, 21:23
Цитата Сообщение от Power_Basic Посмотреть сообщение
Разбор 1000000 слов и разбор 1000020 слов, по времени будет практически идентичен.
Извините, что мешаю вашей милой беседе, а о каком разборе идёт речь ?

Добавлено через 50 секунд
Речь о поиске ?

Добавлено через 1 минуту
Если так, то в словарях и коллекциях искать ничего и не надо, там вы напрямую обращаетесь к элементу по ключу.
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
10.07.2020, 21:50  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
Цитата Сообщение от Power_Basic
Разбор 1000000 слов и разбор 1000020 слов, по времени будет практически идентичен.
Извините, что мешаю вашей милой беседе, а о каком разборе идёт речь ?
Речь о поиске ?
Ну давайте и с вами тоже "мило побеседуем"
И начнём с того,что не надо приписывать мне чужих слов

Если вы любитель начинать чтение тем форума не с начала, а с конца, то объясню, что речь в этой ветке идёт о СОСТАВЛЕНИИ своего собственного словаря (очень большого словаря) из большого количества текстовых файлов по компьютерной тематике.

Цитата Сообщение от I can Посмотреть сообщение
Если так, то в словарях и коллекциях искать ничего и не надо, там вы напрямую обращаетесь к элементу по ключу.
Ну а по мере составления этого словаря, да, приходится искать уже встречавшиеся слова, чтобы не повторять их дважды и увеличивать счётчик "популярности" этого слова. Ну вот и пытаемся выяснить, что для этого выгоднее использовать.
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
10.07.2020, 23:19
Лучший ответ Сообщение было отмечено Power_Basic как решение

Решение

Цитата Сообщение от Power_Basic Посмотреть сообщение
Но это же практически одна и та же цифра!
Ну так добавлять ты будешь не миллионы! Я вот просто для эксперимента перечислил абсолютно все (в том числе и недокументированные API из основных библиотек и у меня получился не очень большой список около 9000 функций)

Вот к примеру слегка модифицировал тот код что я предложил выше, добавил этот список основных API функций, добавил все английские слова, все русские слова. Получилось около 2 миллионов слов. Вместе с чтением, парсингом, удалением дубликатов, сортировкой и записью в файл у меня ушло 22 сек. Это без всяких оптимизаций. Поиск в готовой базе мгновенный, также как и добавление в базу:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
Option Explicit
 
Private Type HashItem
    Value   As String
    Next    As Long
    lCount  As Long
End Type
 
Private m_lHashCount    As Long
 
Private Sub Form_Load()
    Dim hash()      As HashItem
    Dim iFileNum    As Integer
    Dim sContent    As String
    Dim lPrevPos    As Long
    Dim lNextPos    As Long
    Dim lIndex      As Long
    Dim t           As Single
 
    t = Timer
    
    ' // Инициализация хеш таблицы
    ReDim hash(131071): m_lHashCount = 131072
    
    iFileNum = FreeFile
    
    ' // Чтение всего файла в строку
    Open App.Path & "\words.idl" For Binary As #iFileNum
    sContent = Space$(LOF(iFileNum))
    Get iFileNum, , sContent
    Close #iFileNum
    
    lPrevPos = 1
    
    ' // Проход по строкам и добавление записей в хеш таблицу
    Do
        
        lNextPos = InStr(lPrevPos, sContent, vbNewLine)
        If lNextPos = 0 Then lNextPos = Len(sContent)
        
        Add hash(), Mid$(sContent, lPrevPos, lNextPos - lPrevPos)
        lPrevPos = lNextPos + 2
        
    Loop Until lNextPos = Len(sContent)
    
    ' // Сортировка хеш таблицы
    qSort hash, 0, m_lHashCount - 1
    
    ' // Вывод в файл
    Open App.Path & "\words_sort_unique.idl" For Output As #iFileNum
    
    For lIndex = 0 To m_lHashCount - 1
        ' // Выводим только инициализированные данные
        If Len(hash(lIndex).Value) Then
            Print #iFileNum, hash(lIndex).Value, hash(lIndex).lCount
        End If
    Next
    
    Close #iFileNum
    
    MsgBox Format$(Timer - t, "0.000s")
    
    
End Sub
Private Sub qSort( _
            ByRef tHash() As HashItem, _
            ByVal lLow As Long, _
            ByVal lHigh As Long)
    Dim lI As Long, lJ As Long, lM As Long, tS As HashItem
    
    lI = lLow: lJ = lHigh: lM = (lI + lJ) \ 2
    
    Do Until lI > lJ
    
        Do While tHash(lI).Value < tHash(lM).Value
            lI = lI + 1
        Loop
        
        Do While tHash(lJ).Value > tHash(lM).Value
            lJ = lJ - 1
        Loop
        
        If lI <= lJ Then
        
            If lI = lM Then
                lM = lJ
            ElseIf lJ = lM Then
                lM = lI
            End If
            
            ' // Тут можно неплохо оптимизировать заменив копирование строк обменом
            tS = tHash(lJ)
            tHash(lJ) = tHash(lI)
            tHash(lI) = tS
            
            lI = lI + 1: lJ = lJ - 1
            
        End If
        
    Loop
    
    If lLow < lJ Then qSort tHash, lLow, lJ
    If lI < lHigh Then qSort tHash, lI, lHigh
    
End Sub
 
Private Sub Add(Items() As HashItem, Value As String)
    Dim I   As Long
    Dim N   As Long
    
    I = CalcHash(Value)
    
    If Len(Items(I).Value) Then
        If StrComp(Items(I).Value, Value, vbTextCompare) = 0 Then
            Items(I).lCount = Items(I).lCount + 1
            Exit Sub
        End If
        Do While Items(I).Next
            I = Items(I).Next
            If StrComp(Items(I).Value, Value, vbTextCompare) = 0 Then
                ' // Увеличиваем кличество повторений
                Items(I).lCount = Items(I).lCount + 1
                Exit Sub
            End If
        Loop
        
        If m_lHashCount > UBound(Items) Then
            ReDim Preserve Items(m_lHashCount + 1000000)
        End If
 
        Items(m_lHashCount).Value = Value
        Items(I).Next = m_lHashCount
 
    Else: Items(I).Value = Value
    End If
    
    m_lHashCount = m_lHashCount + 1
    
End Sub
Private Function CalcHash(s As String) As Long
    Dim I   As Long
    Dim c   As Integer
    For I = 1 To Len(s)
        c = Asc(LCase(Mid$(s, I, 1)))
        If c = 0 Then Exit For
        CalcHash = (CalcHash * 11 + c) And &HFFFFFF
    Next
    CalcHash = CalcHash And &H1FFFF
End Function
Добавлено через 8 минут
Цитата Сообщение от Power_Basic Посмотреть сообщение
Какие-то двоичные файлы... А мне нужны текстовые. Или это такой компонент, который надо как-то через Reference добавлять?
Нет, это утилита которая может извлечь все API из библиотеки (судя по теме они и нужны).

Цитата Сообщение от I can Посмотреть сообщение
Если так, то в словарях и коллекциях искать ничего и не надо, там вы напрямую обращаетесь к элементу по ключу.
Обращение по ключу и есть поиск. В словарях поиск идет по хеш таблице, в коллекции по RB-дереву.

Добавлено через 51 минуту
Цитата Сообщение от The trick Посмотреть сообщение
Вместе с чтением, парсингом, удалением дубликатов, сортировкой и записью в файл у меня ушло 22 сек
Небольшими оптимизациями удалось даже уменьшить время до 11 секунд.
2
Эксперт по электронике
7239 / 3417 / 348
Регистрация: 28.10.2011
Сообщений: 13,462
Записей в блоге: 7
11.07.2020, 00:21
Цитата Сообщение от Power_Basic Посмотреть сообщение
К сожалению, создание x64 приложений мне пока не по зубам
Тогда нужно ограничить количество слов и их длину.

Цитата Сообщение от Power_Basic Посмотреть сообщение
А как же тогда слова-то по алфавиту расставить в самом концу?
Как вариант скопировать из ассоциативного массива в обычный и его отсортировать.

Цитата Сообщение от Power_Basic Посмотреть сообщение
Ну это как сказать
У меня сейчас наполеоновские планы и соответствующие аппетиты
Для x86 приложения нужно уменьшить "аппетит".
Ведь не хотите чтобы приложение вылетело из-за использования больше 2 ГБ памяти? При этом будет потерян результат работы.

Цитата Сообщение от The trick Посмотреть сообщение
Ну так добавлять ты будешь не миллионы! Я вот просто для эксперимента перечислил абсолютно все (в том числе и недокументированные API из основных библиотек и у меня получился не очень большой список около 9000 функций)
Добавьте сюда все функции ядра, все константы, структуры, интерфейсы и т. д.

Цитата Сообщение от The trick Посмотреть сообщение
Visual Basic
1
Add hash(), Mid$(sContent, lPrevPos, lNextPos - lPrevPos)
Эта строка добавляет текст в любом случае или производится проверка наличия ключа и если он есть новый не добавляется, а данные перезаписываются в том что есть? По условию задачи нужно искать слово и если оно есть, увеличить значение переменной.
Вообще добавление какое-то странное. Где в строке ключ, а где значение?
1
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
11.07.2020, 01:21
Цитата Сообщение от locm Посмотреть сообщение
Добавьте сюда все функции ядра, все константы, структуры, интерфейсы и т. д.
Так это вместе с функциями ядра. Я не думаю что если собрать абсолютно все сущности вместе, будет больше 50 тыс.

Цитата Сообщение от locm Посмотреть сообщение
Эта строка добавляет текст в любом случае или производится проверка наличия ключа и если он есть новый не добавляется, а данные перезаписываются в том что есть?
Ну в хеш таблицу невозможно добавить 2 одинаковых значения. Если взглянешь на код то увидишь:
Visual Basic
1
Items(I).lCount = Items(I).lCount + 1
Увеличивается счетчик повторений.

Цитата Сообщение от locm Посмотреть сообщение
Где в строке ключ, а где значение?
Ключ - слово, значение - счетчик повторений.
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
11.07.2020, 02:49  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Ну так добавлять ты будешь не миллионы! Я вот просто для эксперимента перечислил абсолютно все (в том числе и недокументированные API из основных библиотек и у меня получился не очень большой список около 9000 функций)
Это меня только радует, потому что (наперёд знаю) с реально гигантским словарём работать будет очень неудобно.

Цитата Сообщение от The trick Посмотреть сообщение
Вот к примеру слегка модифицировал тот код что я предложил выше
Спасибо! Завтра весь день посвящу изучению этих хэшей, раз уж они такие полезные и быстрые. Да и с кодом тоже поэкспериментирую.

Цитата Сообщение от The trick Посмотреть сообщение
добавил все английские слова, все русские слова.
Вот отдельное спасибо за эти ссылки. Превосходная база английских слов. А вот с русскими у меня проблема
На самом деле, я на днях уже побывал на том сайте в своих поисках словарей. На английскую страницу, к сожалению, не попал, попал сразу на русскую. А она у меня и тогда, и сейчас выглядит, как показано на приложенном на скриншоте.

Ну разумеется, я сразу понял, что какая-то проблема с кодировкой. Скопировал фрагмент "зашифровонного" текста, перетащил в Notepad++. Перепробовал там все кириллические кодировки, все эти КОИ-фигои
И с BOM, и без BOM
И никакого результата

Потом даже посмотрел в шестнадцатеричном виде. Ну просто коды знаков вопроса и всё...
Ну, думаю, какой-то фейк или розыгрыш, ну и свалил поскорее с того сайта, пока вирусов не нахватался
А до английского словаря так и не добрался. Шикарный словарь! То что надо!

Ну а русский попробую "расшифровать" программой "Штирлиц", если вы мне не выдадите священную тайну, какая там всё-таки кодировка

Цитата Сообщение от The trick Посмотреть сообщение
Вместе с чтением, парсингом, удалением дубликатов, сортировкой и записью в файл у меня ушло 22 сек.
Классно!!!
Честно говоря, я готов "вытерпеть" пару часов, но уж точно не целые сутки
На самом деле, я написал на PowerBasic'е такую программу, подробности которой пересказал в топике.
Закинул в неё 8,5 МБ "исходного"материала, - просто сгрёб со своего компа множество HTML-файлов по компьютерной тематике, которые попались под руку. Там и лекции по VB6, и архивы целых компьютерных сайтов, которые когда-то скачивал WGETом.
И вся эта "музыка" обрабатывалась у меня ну минут 10, наверно. Отсюда я сделал вывод, что "серьёзные" объёмы вообще потянут на целые сутки. Потом замерил время каждой потенциально затратной (по времени) операции и выяснил, что именно поиски в уже созданной базе данных занимают львиную часть всего времени. И чем больше разрастается база, тем более мизерными выглядят затраты времени на все другие операции по сравнению с задержками на эти поисками. Вот, собственно, это и побудило меня открыть эту ветку.

Цитата Сообщение от The trick Посмотреть сообщение
Нет, это утилита которая может извлечь все API из библиотеки (судя по теме они и нужны).
Да "судя по теме", я и сам точно не знаю, что именно нужно
Готовых решений здесь нет, приходится применять "творческий подход"
Но общий принцип такой: чем больше будет составленная (в конечном итоге) база, тем больше шансов, что она подойдёт для выявления ошибок распознавания более широкого круга компьютерной литературы (по разной тематике).

Цитата Сообщение от The trick Посмотреть сообщение
Небольшими оптимизациями удалось даже уменьшить время до 11 секунд.
Не, ну так не интересно
Эдак я и на кнопку не успею нажать, и процессом насладиться

Цитата Сообщение от locm Посмотреть сообщение
Тогда нужно ограничить количество слов и их длину.
Ну "ограничить количество слов" это понятно, но длину ... нет, это никак нельзя. Самые сложные для распознавания слова как раз и есть самые длинные. Я сейчас имею в виду как раз те самые "склееныые" слова, которые процитировал выше.
OCR может распознать такое слово, например, вот так:

ConvertSec urityDescr iptorToString SecurityDescriptor
Ну то есть как 4 отдельных слова. А вот если бы это слово содержалось бы целиком в загруженном в неё пользовательском словаре, тогда, думаю, что такой ошибки бы не возникло. Хотя, справедливости ради, должен сказать, что именно эти два длиннющих слова (они оба на скриншоте) были распознаны безукоризнено. Они мне сейчас просто попались под руку для рассказа об одной из наиболее частых ошибок.

Не по теме:

Ну и ещё из забавного: наш любимый COM++ в 50% случаев распознаётся как СОМ. На первый взгляд вроде бы никакой разницы :)
Но в первом случае, это Component Object Model, а во втором это огромная (аж с двумя плюсами!) рыба сом :)
Ну и разумеется, речевой движок именно так и прочитает :)

Ну и конечно, отвратительная схожесть цифры 1 с заглавной буквой I и строчной буквой l. OCR очень часто их путает. А движок как написано, так и прочитает. Ну вот и хочу вылавливать такие огрехи с помощью словаря.

Вот ещё вспомнил из забавного:
OneCore частенько распознаётся как ОпеСоге. Вот даже сейчас у меня на мониторе они выглядят совершенно одинаковыми, хотя я прекрасно знаю, что в первом случае это "ОдноЯдро", а во втором таинственное "ОПЕСОГЕ" :)



Цитата Сообщение от locm Посмотреть сообщение
Как вариант скопировать из ассоциативного массива в обычный и его отсортировать.
Пожалуй, да. Как говорится, дёшево и сердито

Цитата Сообщение от locm Посмотреть сообщение
Для x86 приложения нужно уменьшить "аппетит".
Ведь не хотите чтобы приложение вылетело из-за использования больше 2 ГБ памяти? При этом будет потерян результат работы
Ну всё-таки мне кажется, что в 1 гиг я при любом раскладе уложусь.
А иначе даже просматривать такую орясину будет негде. Ну не в Блокноте же, который уже с двух мегов текста начинает заметно притормаживать. Да и Ворд тоже (примерно с десяти).

Цитата Сообщение от locm Посмотреть сообщение
Добавьте сюда все функции ядра, все константы, структуры, интерфейсы и т. д.
Ну это да. Да хоть любую тему взять навскидку. Программирование на разных языках, Интернет, да много ещё чего. И везде своя специфика и своя разветвлённая терминология.
Короче, граф Лев Толстой со своим относительно бедным лексиконом "отдыхает"
И нервно косит траву босиком
Миниатюры
Как наиболее рационально подойти к разбиению очень большого текста на отдельные слова?   Как наиболее рационально подойти к разбиению очень большого текста на отдельные слова?  
1
bite
 Аватар для I can
5011 / 4841 / 852
Регистрация: 13.04.2015
Сообщений: 10,123
11.07.2020, 06:40
Цитата Сообщение от Power_Basic Посмотреть сообщение
именно поиски в уже созданной базе данных занимают львиную часть всего времени.
Вариант с созданием нормальной базы данных, например MSSQL, даже не рассматривали ?
0
 Аватар для Pro_grammer
6807 / 2840 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
11.07.2020, 07:25
Цитата Сообщение от Power_Basic Посмотреть сообщение
Ну а русский попробую "расшифровать"
Не надо там ни чего расшифровывать.
У вас браузер не умеет правильно отображать win ANSI кириллицу.
Надо сразу скачать этот файл на свой диск, а не копипастить!
Облегчаю вам задачу
Вложения
Тип файла: zip MozilaDown.zip (4.68 Мб, 2 просмотров)
1
Эксперт по электронике
7239 / 3417 / 348
Регистрация: 28.10.2011
Сообщений: 13,462
Записей в блоге: 7
11.07.2020, 11:57
Цитата Сообщение от The trick Посмотреть сообщение
Ну в хеш таблицу невозможно добавить 2 одинаковых значения.
Внимательней взглянул на код. Используется не хеш таблица, а динамический массив структур, на котором организован односвязный список.
Visual Basic
1
2
3
4
5
6
7
Private Type HashItem
    Value   As String
    Next    As Long
    lCount  As Long
End Type
 
Dim hash()      As HashItem
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
11.07.2020, 12:25
Цитата Сообщение от locm Посмотреть сообщение
Внимательней взглянул на код. Используется не хеш таблица, а динамический массив структур, на котором организован односвязный список.
Видимо невнимательно. Это хеш таблица с открытым хешированием.
0
Эксперт по электронике
7239 / 3417 / 348
Регистрация: 28.10.2011
Сообщений: 13,462
Записей в блоге: 7
11.07.2020, 12:27
Цитата Сообщение от The trick Посмотреть сообщение
Это хеш таблица
Разве что на основе массива...
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
11.07.2020, 12:35
Цитата Сообщение от locm Посмотреть сообщение
Разве что на основе массива...
Какая разница? От этого она хеш таблицой не перестает быть. Данные без коллизий добавляются в соответствующие ячейки массива, те что с коллизиями "в хвост".

Добавлено через 17 секунд
Цитата Сообщение от locm Посмотреть сообщение
Разве что на основе массива...
Какая разница? От этого она хеш таблицой не перестает быть. Данные без коллизий добавляются в соответствующие ячейки массива, те что с коллизиями "в хвост".
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
11.07.2020, 16:16
Цитата Сообщение от Power_Basic Посмотреть сообщение
Мне на ум приходит, что можно попробовать вставлять в "базу данных" новые слова сразу в алфавитном порядке, а потом начинать поиск (но как?) с первой буквы слова-кандидата.
А в чём проблема то. Всё правильно написали.
Изучайте как работает БД, например почитайте Грубера "Понимание SQL".
Устанавливаете БД (есть как служба, например mysql, есть вариант portable - sqlite, можно даже в xls хранить).
Затем ищите правильную строку подключения из-под vb6 к выбранной вами БД. Можете поискать по моему нику на форуме "mysql", под vba писал примеры, vb6 тоже самое.

Запрос на добавление в таблицу БД (будут колонки Name и Count):

MySQL
1
2
3
4
5
CREATE TABLE IF NOT EXISTS `WORDS` (
  `Name` varchar(64) NOT NULL DEFAULT '' UNIQUE,
  `Count` SMALLINT NOT NULL DEFAULT '1',
  PRIMARY KEY (`Name`)
  ) ENGINE=MyISAM DEFAULT CHARSET=ascii;
(если слова будут не латиница, то лучше CHARSET=utf8)

Запрос на добавление нового слова:

MySQL
1
INSERT INTO `WORDS` SET `Name` = 'GetWindowPos';
Если нужно, чтобы делался сразу авто-инкремент кол-ва одинаковых слов, то:

MySQL
1
INSERT INTO `WORDS` SET `Name` = 'GetWindowPos' ON DUPLICATE KEY UPDATE Count = Count + 1;
Запрос на выборку всех слов по 1-й букве "G":

MySQL
1
SELECT * FROM `WORDS` WHERE `Name` LIKE 'G%';
2
Наивное Существо
 Аватар для vedunasv
666 / 141 / 27
Регистрация: 09.05.2020
Сообщений: 750
Записей в блоге: 15
11.07.2020, 16:23
Power_Basic
Цитата Сообщение от Power_Basic Посмотреть сообщение
Не, ну так не интересно
Эдак я и на кнопку не успею нажать, и процессом насладиться
,
правильно!!!! так их,так!
А то The trick уже нос задирает!!!!

The trick, вообще-то это здорово!
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
11.07.2020, 22:27  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Цитата Сообщение от Power_Basic
Вот допустим, уже у меня готова отсортированная коллекция.
Возможно ее не получится отсортировать, т. к. построена на основе дерева, а не списка или массива.
И всё-таки можно!
Вчера уже поздно ночью нагуглил вот такой совет:

Самый смешной способ: поставьте невидимый листбох со свойством Sorted = True. Загрузите в него свою коллекцию, а выгрузите в другую. Последняя и будет содержать сортированные элементы. Но это так идея, от фонаря.
Добавлено через 4 минуты
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Не надо там ни чего расшифровывать.
У вас браузер не умеет правильно отображать win ANSI кириллицу.
Надо сразу скачать этот файл на свой диск, а не копипастить!
Облегчаю вам задачу
Да, спасибо, действительно, если сохранить как обычную страницу через контекстное меню "Сохранить как ...", то сохраняется именно как текст в удобочитаемом формате.
Меня на том сайте ввела в заблуждение фраза:

(Sorry about that, but we can’t show files that are this big right now.)
(Извините, но сейчас мы не можем показать файлы такого большого размера.)
Я там нажал на кнопку "Download" и мне открылась страница с каракулями.
А поскольку я на тот момент пребывал в полной уверенности, что такой (казалось бы) пустяк - простое перечисление большинства английских и русских слов - найти во всём огромном интернете будет не такой уж и сложной задачей, я просто ушёл с того сайта по другим ссылкам, которые нагуглил по своему запросу.
А теперь вот выясняется, что это вообще единственный и уникальный источник. Ну дела!

И кстати, да, эти два "словарика" по объёму совсем-совсем не хилые, что меня очень сильно радует

Добавлено через 6 минут
Цитата Сообщение от I can Посмотреть сообщение
Цитата Сообщение от Power_Basi
именно поиски в уже созданной базе данных занимают львиную часть всего времени.
Вариант с созданием нормальной базы данных, например MSSQL, даже не рассматривали ?
Нет, не рассматривали
В мои ближайшие планы не входит изучение искусства составления баз данных
В процитированных вами словах под термином "база данных" подразумевался тот массив, который составляется в процессе закидывания в "мясорубку" всё новых и новых текстов в моей VB-программе.

Добавлено через 17 минут
Цитата Сообщение от Dragokas Посмотреть сообщение
А в чём проблема то. Всё правильно написали.
Ну написали-то может и правильно, но только не для моего случая

Цитата Сообщение от Dragokas Посмотреть сообщение
Изучайте как работает БД, например почитайте Грубера "Понимание SQL".
Устанавливаете БД (есть как служба, например mysql, есть вариант portable - sqlite, можно даже в xls хранить).
Затем ищите правильную строку подключения из-под vb6 к выбранной вами БД. Можете поискать по моему нику на форуме "mysql", под vba писал примеры, vb6 тоже самое.
Запрос на добавление в таблицу БД (будут колонки Name и Count):

Не по теме:

Если вы мне предлагаете изучать новый язык, то нет, увольте :)
Я вовсе не собираюсь пытаться объять необъятное :)
Это вам - профессионалам - нужно сразу всё. А мне - продвинутой домохозяйке - нужно только то, что интересно и полезно для достижения ближайшей поставленной цели.

Ну давайте расскажу вам по порядку про мою ближайшую цель,поскольку темы на форумах с самого начала мало кто читает кроме модераторов :)
У меня написана своя собственная программа для озвучивания текстов. И так совпало по времени, что когда я её окончательно "допилил", вы мне вот здесь
Объём свободной памяти ОЗУ?
порекомендовали очень хорошую книгу.

И мне захотелось её не только прочитать, но ещё и озвучить. Но столкнулся с проблемой, что она доступна только в формате PDF. Эначит надо распознавать с помощью OCR. Перепробовал несколько программ, у каждой свои косяки.
Появилось несколько идей на тему "как можно с помощью своих самодельных программ вылавливать и исправлять эти ошибки, имея (или составив самостоятельно) словарь". Начал поиски словарей в интернете (с акцентом на компьютерную тематику), не нашёл. Нет, есть очень много толковых словарей, разъясняющих каждый термин, но простой базы слов (опять же повторюсь, с компьютерным уклоном), увы, нету :(

Начал писать свою программу, которая (по замыслу) будет создавать словарь из огромной кучи компьютерных текстов, которые я буду закидывать в эту "мясорубку".
Написал.
Обнаружил, что она работает недостаточно быстро.
Стал анализировать.
Выяснил, что львиную часть времени эта программа тратит на поиски в составляемой (по ходу работы программы) базе данных. А этот этап необходим, чтобы не добавлять одно и то же слово дважды и вести подсчёт "популярности" слов.
Открыл эту ветку, чтобы получить советы, как можно ускорить этот процесс.
Получил и очень доволен! :)
Как раз сейчас занимаюсь изучением всех предложенных вариантов.

А вы меня сейчас уводите куда-то далеко в сторону :)

Цитата Сообщение от Dragokas Посмотреть сообщение
Изучайте как работает БД, например почитайте Грубера "Понимание SQL".
Устанавливаете БД (есть как служба, например mysql, есть вариант portable - sqlite, можно даже в xls хранить).
Вот, допустим, есть ствол дерева (мой замысел) и я по нему карабкаюсь вверх к поставленньой цели - озвучить книгу без ошибок.
И всё, что помогает мне в достижении поставленной задачи, то приветствуется и принимается с большой искренней благодарностью.
А всё, что уводит куда-то в сторону, - к блужданию по заманчивым веткам воображаемого дерева вместо продвижения к цели, то приходится отодвигать в сторону ввиду, опять-таки, невозможности объять необъятное :)

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

Но, в любом случае, за советы и за желание помочь, большое спасибо.

1
Эксперт по электронике
7239 / 3417 / 348
Регистрация: 28.10.2011
Сообщений: 13,462
Записей в блоге: 7
12.07.2020, 00:25
Цитата Сообщение от Power_Basic Посмотреть сообщение
Самый смешной способ: поставьте невидимый листбох со свойством Sorted = True. Загрузите в него свою коллекцию, а выгрузите в другую. Последняя и будет содержать сортированные элементы. Но это так идея, от фонаря.
Учитывая число слов и их длину будете ждать сутки если не больше пока все это выполнится.
1
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
12.07.2020, 00:56  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Цитата Сообщение от Power_Basic
Самый смешной способ: поставьте невидимый листбох со свойством Sorted = True. Загрузите в него свою коллекцию, а выгрузите в другую. Последняя и будет содержать сортированные элементы. Но это так идея, от фонаря.
Учитывая число слов и их длину будете ждать сутки если не больше пока все это выполнится.
Да честно говоря, я тоже усомнился в таком подходе, но по немного другой причине.
Где-то с полгода тому назад я попытался вставить в текстбокс PowerBasic'а очень большой фрагмент текста. И он прекрасно вставился, но ... был урезан почти на половину. Отсюда я сделал вывод, что во всех таких контрольках существует определённый предел "ёмкости". Ну и в Визуальном бейсике, наверняка, такая же ситуация, и, следовательно, огромную (а она же именно такая!) коллекцию загрузить в листбокс получится только, дай бог, на один процент

Ну а с учётом ваших соображений, этот вариант, действительно, "смешной", о чём и написал сам его "изобретатель"
Но идея всё-таки, согласитесь, оригинальная

Добавлено через 3 минуты

Не по теме:

vedunasv, вы очень хороший, добрый человек.
Ещё немного и вы мне накрутите репутацию больше чем у всех местных авторитетов, вместе взятых :)

0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
12.07.2020, 01:45
Power_Basic, мне вас не понять. Сначала вы спрашиваете про оптимальный по скорости вариант.
Я вам составил уже готовые запросы. Язык изучать не нужно. Даже натолкнул, где взять пример использования.
Ну вы так сразу в 1-м посте и пишите следующий раз, что вам нужно разжевать до мелочей и выложить
готовую прогу с одной кнопочкой. Предельно странные делаете выводы. Больше на ваши темы отвечать желания нет.

Цитата Сообщение от Power_Basic Посмотреть сообщение
Самый смешной способ: поставьте невидимый листбох со свойством Sorted = True. Загрузите в него свою коллекцию, а выгрузите в другую. Последняя и будет содержать сортированные элементы. Но это так идея, от фонаря.
Ещё проще разложить на песке палочками.
2
12.07.2020, 02:48  [ТС]

Не по теме:

Цитата Сообщение от Dragokas Посмотреть сообщение
Power_Basic, мне вас не понять. Сначала вы спрашиваете про оптимальный по скорости вариант.
Я вам составил уже готовые запросы. Язык изучать не нужно. Даже натолкнул, где взять пример использования.
Ну вы так сразу в 1-м посте и пишите следующий раз, что вам нужно разжевать до мелочей и выложить
готовую прогу с одной кнопочкой. Предельно странные делаете выводы. Больше на ваши темы отвечать желания нет.
Да просто ваши советы очень сильно припозднились и выглядели довольно сложными в исполнении, да и к тому же уже есть готовое решение, которое меня вполне устраивает.
Я вам сказал спасибо, ну и что ещё от меня требуется, я не понимаю. Ну давайте ещё раз скажу вам спасибо и расстанемся добрыми друзьями :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.07.2020, 02:48

Что делать с многими файлами большого и не очень текста, а точнее как бы по быстрее его загружать под Windows XP !?
Ситуация такая: ПК с WinXP Pro (x86) и 2ГБ оперативки. Есть много различных текстов. Я мог бы их отправить в doc, docx но тогда нужно...

Разбиение текста на отдельные слова и символы
Необходимо разбить текст, на отдельные символы и слова. К примеру, есть текстовый файл с кодом какой то небольшой программы на с#, его...

Вытащить из текста все отдельные слова
Задача в том, чтобы вытащить из текстового файла слова и отсортировать их по частоте встречаемости. Вторую часть программы могу сделать:)...

Парсинг текста на отдельные символы или слова
Есть вот такой текст 1024,32,&quot;Agree&quot;,2,4,0,176,0,1,,2013-02-13 01:49:36,2013-02-13...

Объединить функции selectDate(), setPrev() и setNext() в одну наиболее рационально
&lt;HTML&gt; &lt;HEAD&gt; &lt;META http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=windows-1251&quot;&gt; &lt;TITLE&gt;Календарь&lt;/TITLE&gt; &lt;STYLE...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru