Воскресенье, 05 Декабря 2010 г. 13:11
+ в цитатник
Моя вторая половина иногда в укор говорит, что редко завершаю начатые дела. В последнее время стараюсь бороться с этим. Недавно потратил три часа на "запоминалку". Цифры плохо запоминаю, а слова нормально, вот и подумал о процессе обратном Т9 в телефоне. Указываешь номер - подбирается слово или ряд слов.
К сожалению оказалось, что плотности слов не хватает чтобы покрыть все числа, например ряд от 1000 до 1200 содержит процентов 50 слов. Поэтому результат - отрицательный. Но ведь это тоже результат : ), поэтому ниже лежат исходники и пример применения. Типа точка завершения.
code:
CachÙ Studio clip Class Mnemonik.MnemoNumber Extends %RegisteredObject
{
ClassMethod InitKeyMap()
{
s i = 0
s ^KeyMap("А") = i
s ^KeyMap("Б") = i
s ^KeyMap("В") = i
s i = i + 1
s ^KeyMap("Г") = i
s ^KeyMap("Д") = i
s ^KeyMap("Е") = i
s i = i + 1
s ^KeyMap("Ж") = i
s ^KeyMap("З") = i
s ^KeyMap("И") = i
s i = i + 1
s ^KeyMap("К") = i
s ^KeyMap("Э") = i
s ^KeyMap("М") = i
s i = i + 1
s ^KeyMap("Н") = i
s ^KeyMap("О") = i
s ^KeyMap("П") = i
s i = i + 1
s ^KeyMap("Р") = i
s ^KeyMap("Ю") = i
s ^KeyMap("Т") = i
s i = i + 1
s ^KeyMap("У") = i
s ^KeyMap("Ф") = i
s ^KeyMap("Х") = i
s i = i + 1
s ^KeyMap("Ц") = i
s ^KeyMap("Ч") = i
s ^KeyMap("Ъ") = i
s i = i + 1
s ^KeyMap("Щ") = i
s ^KeyMap("Ш") = i
s ^KeyMap("Ь") = i
s i = i + 1
s ^KeyMap("Л") = i
s ^KeyMap("С") = i
s ^KeyMap("Я") = i
}
/// парсим слово
ClassMethod GetNumber(word) As %String
{
s number = ""
s word = $system.SQL.ALPHAUP(word)
f i=1:1:$length(word)
{
s alpha = $e(word, i,i)
continue:(alpha = " ")
s number = number_$g(^KeyMap(alpha), 0)
}
q number
}
/// добавить в словарь
ClassMethod AddWord(word)
{
s word = $system.SQL.ALPHAUP(word)
s number = ..GetNumber(word)
s ^Words(word) = number
///3 узел = рейтинг
s ^Numbers(number, word, 1) = 1
}
/// получить слово
ClassMethod GetWord(number)
{
if $data(^Numbers(number)) '= 10
{
w "Не найдено слов для данного числа в словаре!"
Q ""
}
Set key = ""
s key = $order(^Numbers(number, key), -1)
q key
}
/// Загрузка словаря (просто набор строк со словами в кодировке )
ClassMethod LoadDictionaryFromFile(filename As %String, encoding = "windows-1251")
{
q:(filename = "") 0
s file = ##class(%IO.FileStream).%New()
set sc = file.Open(filename,"R",0, encoding)
if $$$ISERR(sc)
{
w "Ошибка открытия файла:"_filename_" "_$system.Status.GetErrorText(sc)
q 0
}
while 'file.AtEnd
{
s word = file.ReadLine(..GetMaxLen(), .sc)
if $$$ISERR(sc)
{
w "Произошла ошибка!:",$system.Status.GetErrorText(sc),!
}
continue:(word = "")
d ..AddWord(word)
w "Загружено слово: "_word,!
}
d file.Close()
}
/// Подбор последовательности слов соответствующих заданному числу
ClassMethod Combine(number) As %String
{
s word = ..GetWord(number)
q:(word '= "") word
q:(number <= 10) number
s strnum = ""_number
s len = $length(strnum)
s current = 2
s phrase = ""
s start = 1
f
{
s tmp = $e(strnum, start, current)
s lex = ..GetWord(tmp)
if lex '= ""
{
s phrase = $case(phrase, "":"", :phrase_" ")_lex
s start = current
}
s current = current + 1
q:(current >= len)
}
q phrase
}
ClassMethod Init(filename = "")
{
d ..Cleanup()
d ..InitKeyMap()
d ..LoadDictionaryFromFile(filename)
}
ClassMethod Cleanup()
{
k ^KeyMap
k ^Words
k ^Numbers
}
/// Support
ClassMethod GetMaxLen() As %Numeric
{
q 8000
}
}
Пример применения со словарем на 100 тысяч слов:
USER>f i=3000:1:3020 w i," = ",##class(Mnemonik.MnemoNumber).Combine(i),!
3000 = КАВА
3001 = МАЙЕ
3002 =
3003 = МАЙК
3004 = МАЙО
3005 = МББР
3006 = КАЙФ
3007 =
3008 =
3009 = МАЙЯ
3010 = МБДА
3011 =
3012 = МАГИ
3013 = МАЕМ
3014 = МАДО
3015 = МАЕТ
3016 = МАГУ
3017 =
3018 =
3019 =
3020 = МАЗА
-
Запись понравилась
-
0
Процитировали
-
0
Сохранили
-