Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2014.01.19;
Скачать: [xml.tar.bz2];

Вниз

нечеткий custom датасет   Найти похожие ветки 

 
[ВладОшин] ©   (2013-07-11 14:51) [0]

например

12323   балясина  01.01.2013
12323   Чайковский  02.01.2013
12323  Абдулла Хан  03.01.2013

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

но: человек поймет. Если есть оговоренный позиционный формат(а он есть), то мой класс делает из TClientDataSet таблицу в памяти, лопатит, результат.

Есть какие идеи, как заставить понять компьютер покореженное?

Попытка думаю такая:
1. Для начала надо разделить на колонки. Считаем, что везде текст.
1.1. Если пробелов более одного подряд(или спец.символ (tab, etc)) - считаем разделителем.
1.2. Считаем сколько колонок получается  по каждой строке. Принимаем, что число колонок в тексте равно минимальному из полученных.
1.3. Начинаем заменять все двойные пробелы в строках, имеющих разделителей больше, чем в минимальной. До тех пор, пока разделителей не будет везде одинаково. Это и считаем датасетом, пока сплошь текстовым .
2. Понять что это не текст
2.1. Сходу попытаться объявить колонку числом, датой, etc. Получилось - ура, победа, суши весла.
2.2. В строке, где много(кол-во/общее колво > 0.5) символов "0"-"9", заменить отличные от символов  "0"-"9" на decimalseparator(timeseparator) и попытаться объявить колонку числом, датой, etc.
Получилось - ура, победа, суши весла.

есть что посоветовать?


 
брат Птибурдукова   (2013-07-11 14:56) [1]


> Есть какие идеи, как заставить понять компьютер покореженное?
Гы, я такое на одном из собеседований писал…


 
[ВладОшин] ©   (2013-07-11 15:09) [2]

ну а я просто так решил сделать

Почти просто так, на самом деле после одного глюка в присланном, и ошибки автоматической конвертации. А как полез - вообще ничего не помню, что там и откуда. Был бы "интеллектуальный" класс - сработал бы.. Прислали со всеми удвоенными пробелами. А по договору - позиционное исчисление. Надо бы обработать, только что бы письмо прислалось, дескать, тут неожиданность случилась, обрати внимание. Ну и осталось бы только поругаться с отправителем :) - дело сделано, и без воспоминаний что там и откуда и куда.


 
[ВладОшин] ©   (2013-07-11 15:10) [3]

>> брат Птибурдукова   (11.07.13 14:56) [1]
кстати, что писал то?


 
MBo ©   (2013-07-11 15:22) [4]

Такое можно обработать конечным автоматом (машина состояний).
Последовательность состояний для третьего примера:
1. неопределенное (начальное)
2. в числе
3. число закончилось
4. в тексте
5. текст закончился
6. нет, блин, продолжается
7(5). текст закончился
8. в дате
9. строка закончилась

при переходах 3-4, 7-8, 8-9 вычленяются значимые части подстрок.
P.S. в простом варианте обломается на Карл 12-й (хотя это и неканоничная запись)


 
[ВладОшин] ©   (2013-07-11 15:36) [5]


> MBo ©   (11.07.13 15:22) [4]

не понял..
>> 12323  Абдулла Хан  03.01.2013
это для примера было
я хочу универсально :)
что бы подсунуть
цукукукук 2323 01.01.2013
цукукукук 2323 01.01.2013

или
232323 цукукукук 2323 01.01.2013
45454    цукукукук 2323 01.01.2013

а на выходе - датасет. Как его бы понял человек.

т.е. заранее ничего про текст не знаем. Предположить какое поле будет первым (число, текст, etc) - невозможно.

т.е. мы ему *.txt, без уточнений где там что и сколько этого там есть
он нам это показывает (ровненько(в dbgride, например))

Примерно это делает excel, когда его натравливаешь на файл подобного рода.
Но Excell начинает спрашивать, да есть ли разделитель, какой, или проведи линию разделяющую колонки. Да кого они типа у тебя, укажи.

Это все человек понимает. Я хочу, что бы программа еще поняла. Интересно что-то стало :)


 
Kerk ©   (2013-07-11 15:38) [6]

Тут нужен банальный простой регэксп же. Конечный автомат тоже конечно можно соорудить, но зачем делать руками, если можно написать простой регэксп.


 
Kerk ©   (2013-07-11 15:38) [7]


> [ВладОшин] ©   (11.07.13 15:36) [5]

Этого не видел, когда [6] писал.
Тут тебе поможет искусственный интеллект. Или на крайний случай некий набор эвристик.


 
Компромисс1 ©   (2013-07-11 16:10) [8]


> Интересно что-то стало :)


Тогда сам придумывай. Какой может быть интерес в кодировании готовой идеи, подсказанной форумом? :)


 
MBo ©   (2013-07-11 16:19) [9]

вот это:
>цукукукук 2323 01.01.2013
с использованием конечного автомата обработать можно

а это:
>232323 цукукукук 2323 01.01.2013
и человек не сможет однозначно соотнести с трёхколоночным образцом


 
MBo ©   (2013-07-11 16:21) [10]

Кстати, поищи, как справляются (и справляются ли) парсеры адресов, записанных в произвольной форме - похожая задача


 
[ВладОшин] ©   (2013-07-11 16:25) [11]


> MBo ©   (11.07.13 16:21) [10]

угу


> а это:
> >232323 цукукукук 2323 01.01.2013
> и человек не сможет однозначно соотнести с трёхколоночным
> образцом

правильно, потому что тут 4 ре столбца :)
но принять это решение программа должна сама


> огда сам придумывай. Какой может быть интерес в кодировании
> готовой идеи, подсказанной форумом? :)

да вдруг опять велосипед :)
А так - глядишь, может и в кладовку покладу, если сделаю


 
брат Птибурдукова   (2013-07-11 16:27) [12]


> кстати, что писал то?
Думаешь, помню? Помню, что трудозатраты оценил в один час и в него вложился… (это намёк)

По сути — выделил "столбики", выделил самое широкое значение в столбике, всё порастягивал под это значение. (впрочем, датасеты у меня не фигурировали, тупо стринглист)


 
картман ©   (2013-07-11 16:43) [13]


> [ВладОшин] ©   (11.07.13 15:36) [5]

http://www.basegroup.ru/library/cleaning/addresses/

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


 
MBo ©   (2013-07-11 16:47) [14]

>но принять это решение программа должна сама
Ага, а завтра она решит, что скрипач не нужен, и Скайнет построит


 
[ВладОшин] ©   (2013-07-11 16:54) [15]


> картман ©   (11.07.13 16:43) [13]

а.. этих знаю..
я у них качал "NeuralBase - библиотека компонентов для Delphi"
Не внушает доверия, т.к. компилится с хинтами и варнингами, причем вида "может быть неинициализирована". Даже была попытка применить, но привела  к AV.

Хотя, теория вроде стройно описана (скопирастина? :))
(я не про адреса, а вообще, все статьи. Когда разбиралс, что это за фрукт "нейронка" и с чем есть  её).


 
[ВладОшин] ©   (2013-07-11 16:57) [16]


> MBo ©   (11.07.13 16:47) [14]

не совсем.
Должны быть 2 (или более режима). "Сам решай" и "давай я тебе подскажу"
во втором можно указать
сколько ожидаем столбцов,
возможно их типы
и т.п.
Но режим "Сам решай"  должен быть все равно :)


 
брат Птибурдукова   (2013-07-11 17:13) [17]


> Ага, а завтра она решит, что скрипач не нужен, и Скайнет
> построит
Скорей бы уже…


 
Dennis I. Komarov ©   (2013-07-11 22:17) [18]


> а на выходе - датасет. Как его бы понял человек.
>

бла бла  бла
екерный бабай
113 пар быть
завтра не наступит

Что скажет человек?


 
Inovet ©   (2013-07-11 22:19) [19]

> [18] Dennis I. Komarov ©   (11.07.13 22:17)
> Что скажет человек?

Эксель должен сказать - 3 текстовых столбца.


 
Dennis I. Komarov ©   (2013-07-11 22:25) [20]


> Эксель должен сказать - 3 текстовых столбца.

эксель не человек...


 
имя   (2013-07-11 23:10) [21]

Удалено модератором


 
имя   (2013-07-11 23:15) [22]

Удалено модератором


 
Аббат Пиккола   (2013-07-12 00:19) [23]

Удалено модератором


 
[ВладОшин] ©   (2013-07-12 05:40) [24]


> бла бла  бла
> екерный бабай
> 113 пар быть
> завтра не наступит
>
> Что скажет человек?

белиберда :)


 
brother ©   (2013-07-12 06:11) [25]

если формат жесткий, то тогда так:
1. бежим до первого пробела - это гарантированный первый столбец
2. обрабатываем данные столбца, отрезаем из строки его
3. бежим до следующего пробела и смотрим, за ним следующий символ число?
3.1 символ не число - идем дальше
3.2 символ число - значи мы стоим на конце второго столбца
4. обрабатываем данные столбца (избавляемся от лишних пробелов), отрезаем из строки его
5. обрабатываем данные 3 столбца
профит?


 
brother ©   (2013-07-12 06:13) [26]

те фактически разделители столбцов здесь:
1й столбец заканчивается пробелом
2й столбец заканчивается числом


 
[ВладОшин] ©   (2013-07-12 06:21) [27]


> brother ©   (12.07.13 06:13) [26]

далее [0] читал? :)

-------
> бла бла  бла
> екерный бабай
> 113 пар быть
> завтра не наступит
Гораздо интереснее, как тут поступить должна машина
думаю, или в один столбец - явных разграничителей столбцов не видно
или в 3, где во второй строке DataSet есть null(на любой позиции). Весь ds - текстовый


 
brother ©   (2013-07-12 11:52) [28]

> или
> 232323 цукукукук 2323 01.01.2013
> 45454    цукукукук 2323 01.01.2013

тогда объясни, как это интерпритировать?


 
[ВладОшин] ©   (2013-07-12 12:05) [29]


> тогда объясни, как это интерпритировать?

ftInteger, ftString, ftInteger, ftDate

(html лишние пробелы съедает) или  ftInteger, ftString, ftDate


 
Anatoly Podgoretsky ©   (2013-07-12 12:28) [30]

> Аббат Пиккола  (12.07.2013 00:19:23)  [23]

Это скрипач не нужен


 
Dennis I. Komarov ©   (2013-07-12 12:55) [31]


> > бла бла  бла
> > екерный бабай
> > 113 пар быть
> > завтра не наступит
> Гораздо интереснее, как тут поступить должна машина
> думаю, или в один столбец - явных разграничителей столбцов
> не видно
> или в 3, где во второй строке DataSet есть null(на любой
> позиции). Весь ds - текстовый

Машина должна поступить в соответствии с инструкциями программиста, не надо на нее сваливать :)

А почему не в два?
бла бла | бла
екерный | бабай
113 пар | быть
завтра | не наступит


 
[ВладОшин] ©   (2013-07-12 13:08) [32]


> А почему не в два?

потому что кол-во строк с разбиением на два (=1 строка)
меньше, чем по три (=3 строки)


 
[ВладОшин] ©   (2013-07-12 13:11) [33]

хотя..
Да, 2.
Судя по алгоритму из [0].

> 1.2. Считаем сколько колонок получается  по каждой строке.
>  Принимаем, что число колонок в тексте равно минимальному
> из полученных.

Или надо пересмотреть алгоритм.


 
brother ©   (2013-07-12 18:32) [34]

значит нет конкретного тз...


 
TUser ©   (2013-07-12 19:33) [35]

Конкретно в этом случае все просто - надо найти первый и последний пробел. Они делят каждую строку на 3 столбика, среднему надо сделать trim.

Будет ли это работать на всех данных, а не только на данной записи - по вопросу сказать невозможно. В общем случае надо, конечно, посмотреть на то, какие будут исключения (типа в строке "12345 вася01.01.1925" StringToDate не сработает).

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


 
brother ©   (2013-08-02 08:31) [36]

> Они делят каждую строку на 3 столбика

[28] там уже 4


 
разработтчик   (2013-08-02 11:27) [37]

Удалено модератором
Примечание: Теперь уже 7 дней


 
Ega23 ©   (2013-08-02 11:50) [38]

Нарушение режима ведёт к увеличению срока бана.


 
разработтчик   (2013-08-02 12:06) [39]

а можно четырнадцать?


 
Обычный Порошок   (2013-08-02 12:11) [40]

Автор, выкуси регулярками число и дату.
После выкусывания останется только второе поле.
Это же так просто.



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2014.01.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.004 c
15-1374760428
DevilDevil
2013-07-25 17:53
2014.01.19
Интересная задача. Остаток от деления умножением


1-1320150048
vlk32
2011-11-01 15:20
2014.01.19
delphi и обобщенное прораммирование


2-1363671419
Andrey K
2013-03-19 09:36
2014.01.19
Как в Win 8 скопировать отредактированный DELPHI32.DCI


15-1375043600
Petr
2013-07-29 00:33
2014.01.19
DB/2. ацтой или рай?


4-1267675438
Алексей4105
2010-03-04 07:03
2014.01.19
Как узнать путь к процессу?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский