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

Вниз

выделение наиболее частых последовательностей   Найти похожие ветки 

 
[ВладОшин] ©   (2014-03-25 10:24) [0]

есть таблица
Name varchar
Flag char(1)
записей порядка миллиона.
было потрачено много человеко-часов, что бы по имени проставился флаг
т.е. оператор читает наименование и ставит признак. Буквально, да-нет
буквально
"иванов иван иванович" - оператор ставит "Ч" , т.е. человек
"скупка краденного, звони!" - оператор ставит "О" , т.е. объявление

Можно как-то теперь, имея порядка сотни тысяч проставленных признаков, по типичным последовательностям символов в name предположить флаг?

достаточно 90 %% точности.


 
clickmaker ©   (2014-03-25 10:27) [1]

> по типичным последовательностям символов

словарь имен-фамилий?


 
clickmaker ©   (2014-03-25 10:32) [2]

либо анализировать окончания слов на предмет человечности. -ов -ова -нко -вич -вна и т.д.


 
Konstantin   (2014-03-25 10:45) [3]

на абдурахмане-ибн-хассабе не сработает.


 
clickmaker ©   (2014-03-25 10:48) [4]

на Барнаби Мармадюк Алоизий Бенджи Кобвеб Дартаньяне тоже. Ну, попадут они в оставшиеся 10%


 
[ВладОшин] ©   (2014-03-25 10:50) [5]


> словарь имен-фамилий?

как подмножество, да.
конкретнее, интересует сейчас юр.лицо это или частник


> либо анализировать окончания слов на предмет человечности.
>  -ов -ова -нко -вич -вна и т.д.

Это есть :)
набрал 66 000 имен, написал ф-цию
getgenderbyfio("ошин влад виторович") = 1, т.е на 100% мужик
getgenderbyfio("иванова зульфия романовна") = -1, т.е на 100% сударыня.
ну и
getgenderbyfio("шевченко игорь батькович") = 0.66
getgenderbyfio("хаав валентина батьковна") = -0.66
и т.п.


 
[ВладОшин] ©   (2014-03-25 10:53) [6]

абдурахмане-ибн-хассабе - 33% мужик :)


 
clickmaker ©   (2014-03-25 10:55) [7]

> [6] [ВладОшин] ©   (25.03.14 10:53)

а почему? -ан - типично мужское окончание имени


 
Jeer ©   (2014-03-25 11:03) [8]

Taglite:
http://www.dialog-21.ru/archive/2005/kreidlin%20lg/kreydlinl.htm


 
[ВладОшин] ©   (2014-03-25 11:03) [9]

ну так остальные компоненты не дали вердикта - поэтому принижается ценность того кто дал. Если фамилия за мужика а имя нео пределилось - то пополам.
фамилия спорная - как делитель добавит, как знаменатель - 0. Тут более менее нормально. интересует сабж


 
Jeer ©   (2014-03-25 11:06) [10]

>[ВладОшин] ©   (25.03.14 10:53) [6]
>абдурахмане-ибн-хассабе - 33% мужик :)

Вырастет - само решит.


 
Дмитрий СС   (2014-03-25 12:19) [11]

Нейронные сети занимаются обобщением. Попробуйте организовать.


 
Konstantin   (2014-03-25 12:47) [12]

нейронные сети - зло.
см. терминатор


 
И. Павел ©   (2014-03-25 12:52) [13]

> Нейронные сети занимаются обобщением. Попробуйте организовать.

Если на такой задаче, обучаясь всего на миллионе примеров, нейронная сеть даст 90% правильных ответов, то это, скорее всего, будет дедушка терминатора и такое лучше не писать :) Вот цифру по 25 пикселям определить или прогноз изменения функции предсказать — это да.


 
Anatoly Podgoretsky ©   (2014-03-25 13:09) [14]


> clickmaker ©   (25.03.14 10:55) [7]

Регистрировать со снятым штанами


 
Дмитрий СС   (2014-03-25 17:53) [15]


> И. Павел ©   (25.03.14 12:52) [13]

Все так грустно что-ли в нейронных сетях?


 
й   (2014-03-26 07:43) [16]

составляем словарь всех слов (лучше корней, а не форм, но не суть)
для каждого подсчитываем отношение нахождений в списках "О" и "Ч"
принимаем, что при нахождении в новом имени словарного слова это отношение будет показывать вероятность для этого имени оказаться в первом списке
остаётся типа "сложить" (объединить) эти вероятности для всех найденных в словаре слов из нового имени
а вот по какой формуле их нужно объединять - пусть подскажут знатоки теорвера (думаю, тут возможны варианты)


 
й   (2014-03-26 08:23) [17]

... возможно, сработает и простое среднеарифметическое


 
И. Павел ©   (2014-03-26 09:25) [18]

> [15] Дмитрий СС   (25.03.14 17:53)
Все так грустно что-ли в нейронных сетях?

Не все. Но в данной задаче у цепи будет много входных параметров. А чем больше входов, тем сложнее подобрать оптимальную структуру цепи и тем медленнее ее обучить.
В моей задаче был всего 1 вход типа int (прогноз функции), и то еле подобрал более или менее приемлемую структуру. Ради интереса можете попробовать сделать цепь, которая прогнозирует поведение функции sin(x) на 10000 примерах — далеко не любая структура цепи подойдет и выдаст хоть что-то, похожее на синусоиду.


 
Константин 1   (2014-03-26 09:29) [19]


> и простое среднеарифметическое

в делфи есть уже подобное. для английских. по звучанию сравнение.


 
clickmaker ©   (2014-03-26 12:51) [20]

> [19] Константин 1   (26.03.14 09:29)

в дельфи есть soundex?


 
clickmaker ©   (2014-03-26 13:02) [21]

да, есть, однако. в 2010.
Можно русские имена/фамилии транслитерировать и натравить на них буржуйский soundex


 
Jeer ©   (2014-03-26 13:03) [22]

soundex или его аналог здесь не подойдет.


 
И. Павел ©   (2014-03-26 13:58) [23]

> > либо анализировать окончания слов на предмет человечности.
> >  —ов —ова —нко —вич —вна и т.д.
>
> Это есть :)

И какая точность получилась?
В сети полно примеров алгоритмов определения пола. ИМХО, на обычных именах 90% точности получится:
Вот, например: http://wiki.kint.ru/index.php/Определение_рода_по_ФИО_(1С)
А вот теория: http://ivan.begtin.name/2010/05/04/систематизация-распознавания-пола-и/

> В моей задаче был всего 1 вход типа int
:
Ну, точнее, 1 величина + еще несколько предыдущих значений этой величины.


 
ВладОшин ©   (2014-03-27 10:40) [24]


> И какая точность получилась?

мне нужно было 300 000 разделенных, брал только с вероятностью > 0.5
Просмотрелось около 400 000 человек, когда 300 000 набралось
т.е. 75% гарантировано, можно сказать.

Если брать 33% - а таких много, то к 90% выйти можно, думаю.

Но не это главное..


 
ВладОшин ©   (2014-03-27 10:45) [25]

как такой алгоритм:
Заводим таблицу Ценности слов

Берем строку таблицы. Разбиваем на слова. По тем строкам, которые уже оператором распознаны и поставлен признак, по каждому совпадению в таблицу ценности пишем слово и кол-во совпадений, как по признаку Организация, так и по признаку Человек.

Берем след строку таблицы
--

на не распознанных строках разбиваем по словам и все слова ищем в таблице соответствий. Каких признаков больше - то и есть


 
ВладОшин ©   (2014-03-27 10:58) [26]

поясню
Пусть есть "Загс московская область"
имеем: Загс, московская, область
до этого около 20 разных загсов операторы определили как юр.лицо
и пусть 3-4 имеют фамилию типа Загсов, Загсович  и т.п.
имеем 20 / 4 в пользу юриков.
т.е. в таблицу соответствий запишем
NAME = Загс
Legal = 20
Private = 4
и т.п.

Потом, следующего, уже тестируемого, разобьем на слова и поищем эти слова в таблице соответствий. sum() where like "%одно_слово_из_имени_тестируемого%"

т.о. каждое слово даст некий коэффициент за/против юрика/физика
суммируем, смотрим


 
ВладОшин ©   (2014-03-27 11:00) [27]

как бы к вероятности привязаться таким алгоритмом.. что бы от -1 до 1 ответ давало, где abs() вероятность, а знак - юрик/физик

что на что бы поделить такое :)


 
clickmaker ©   (2014-03-27 11:05) [28]

Sign(JurProb - PhysProb)*JurProb/PhysProb


 
ВладОшин ©   (2014-03-27 11:16) [29]

не понял..

вот например "ЗАГС ПРИОКСКОГО РАЙОНА ГЛАВНОЕ УПРАВЛ."
посчитанные совпадения (NAME, Legal , Private )

ЗАГС 8 3
ПРИОКСКОГО 8 0
РАЙОНА 555 0
ГЛАВНОЕ 26 0
УПРАВЛ. 17 0
тут более 90% должно быть юр.лицо


 
ВладОшин ©   (2014-03-27 11:26) [30]

блин, конечно!

(@PRIVAT_SUM -  @LEGAL_SUM) / (@PRIVAT_SUM +  @LEGAL_SUM)


 
ВладОшин ©   (2014-03-27 12:12) [31]

вроде, работает! :)
только вот что странно

word legal privat
ООО 24294 11

уж ООО - всегда было юриком, сколько процедур под это дело писалось..
ан нет :) 11 человек нашлось таки


 
ВладОшин ©   (2014-03-27 16:14) [32]

статистика пока собирается, но уже неплохо

из 85 748 - 5 ошибок когда физика юриком назвала
а наоборот хуже
из 31 766 - 1 310 ошибок когда юрика физиком назвала
ну там сложно - это в основном "ИП ИВАНОВ ИВАН БАТЬКОВИЧ"

хотя.. если только потом искусственно ценность слов типа "ИП" поднять в ту или другую сторону.. проапдейтить LEGAL в 999999, и с любым сочетанием остальных слов будет юр лицо..


 
Inovet ©   (2014-03-27 16:20) [33]

> [32] ВладОшин ©   (27.03.14 16:14)
> "ИП ИВАНОВ ИВАН БАТЬКОВИЧ"

предприниматель
ИП ИВАНОВ ИВАН
сетевой IP
ИП ИВАНОВА ИВАНА
прдпринимательница
ИП ИВАНОВА ИВАНА


 
clickmaker ©   (2014-03-27 16:26) [34]

> прдпринимательница

ИП Головач Лена


 
ТНЕ картман   (2014-03-27 16:27) [35]


> ВладОшин ©   (27.03.14 12:12) [31]


> ну там сложно - это в основном "ИП ИВАНОВ ИВАН БАТЬКОВИЧ"

"ИП тра-ля-ля " - может быть физиком? Сделай словарь исключений: ООО, ОАО...


 
ВладОшин ©   (2014-03-27 16:56) [36]

думаю, как Гарднер описывал самообучающую машину по игре в крестики нолики из спичечных коробков, провести обучение.

Пусть "ИП Головач Лена" склонилась к физику
ИП - 100
Головач  - 50
Лена - 51
тогда "наказываем" Головач и Лена - умножаем вес этих слов на 0.99
а те слова, кто правильно предсказывал, умножаются на 1.01, допустим

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

Но для этого надо статистику собрать побольше, всю возможную, желательно.


 
Кщд   (2014-03-27 21:36) [37]

Влад, а вот нефигово б было оформить Ваши изыскания в общедоступный код


 
Styx   (2014-03-27 23:48) [38]

ИМХО, ИП с чисто философской точки зрения - не понятно, то ли одно, то ли другое. Зависит от задачи, конечно, но вне контекста я бы считал физлицом. Если надо обратное - только жёсткое правило, попытка обучить приведёт к перекосу жизненных ценностей у робота :-)


 
Jeer ©   (2014-03-28 00:27) [39]

Робот имеет право поменять безболезненно даже политическую платформу.


 
turbouser ©   (2014-03-28 00:30) [40]

Ип Ман - китаец такой был, мастер боевых искусств :)
http://ru.wikipedia.org/wiki/%D0%98%D0%BF_%D0%9C%D0%B0%D0%BD


 
clickmaker ©   (2014-03-28 08:47) [41]

> Ип Ман - китаец

значит, надо анализировать еще и регистр символов


 
[ВладОшин] ©   (2014-03-28 20:56) [42]


> Кщд   (27.03.14 21:36) [37]

обязательно, но потом
надо пока идею проверить 6)


 
[ВладОшин] ©   (2014-03-28 21:04) [43]


> обязательно, но потом

т.е. пока "так быстро бегаем, что не успеваем тачки грузить" (с) :)


 
[ВладОшин] ©   (2014-03-31 21:41) [44]

есть таблица, с уже распознанными именами
CREATE TABLE [dbo].[CorpPrivate](
[name] [varchar](999) NULL,
[iscorp] [varchar](999) NULL
) ON [PRIMARY]

--------
создадим таблицу-справочник

CREATE TABLE [dbo].[Spr_CorpPrivate](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[Word] [varchar](50) NOT NULL,
[Corp] [int] NOT NULL,
[Priv] [int] NOT NULL
) ON [PRIMARY]


и триггер, для облегчения заполнения справочника
ALTER TRIGGER [dbo].[insert_spr_corp_priv]
  ON  [dbo].[Spr_CorpPrivate]
  INSTEAD OF INSERT
AS
BEGIN
 SET NOCOUNT ON;
 INSERT INTO [dbo].[Spr_CorpPrivate]
      (Word, [Corp], [Priv])
      SELECT distinct I.[Word], 0, 0
      FROM inserted I
        left join [dbo].[Spr_CorpPrivate] T on T.Word = I.Word
   where T.Word is null;

 update T
 set t.corp = t.corp + Z.corp,
     t.priv = t.priv + Z.priv
 from [dbo].[Spr_CorpPrivate] T
      join (select i.word word, sum(i.corp) corp, sum(i.priv) priv
            from inserted i
      group by word )
                 Z on Z.word = T.Word;
 
 
END

-------------
процедура вставки в справочник. Тупо по словам вставляем в справочник


ALTER PROCEDURE [dbo].[add_to_spr_corp_priv]
@in_str varchar(1024),
@in_CP char(1)
AS
BEGIN
SET NOCOUNT ON;
declare @str varchar(1024);
declare @CP char(1);
--set @str = "ООО "МОЙ ДОМ"";
--set @CP = "Y";
set @str = @in_str;
set @CP = @in_CP;

set @str = replace(@str, ",", " , ");
set @str = replace(@str, ".", " . ");
set @str = replace(@str, "-", " - ");
set @str = replace(@str, """, " " ");
set @str = replace(@str, "  ", " ");

select @str = "select """ + replace(@str, " ", """ as word, 0 corp, 0 priv union all select """) + """,0,0 ";
-- print @str
declare @t table(id int identity, word varchar(100), corp int, priv int);
insert into @t
exec (@str);

if  @CP = "Y"
update @t set corp = 1
else
update @t set priv = 1;

insert into [dbo].[Spr_CorpPrivate] ([Word], [Corp], [Priv])
                              select word, corp, priv
         from @t where word <> "";
END

--------------------

копим слова

declare @FIO varchar(4000), @c char(1);
declare CCC Cursor fast_forward for
  select Q.Name, Q.iscorp
  from [CorpPrivate] Q;

OPEN CCC;
FETCH NEXT FROM CCC INTO @FIO, @c;
WHILE @@FETCH_STATUS = 0
BEGIN
 exec add_to_spr_corp_priv  @FIO, @c;
 FETCH NEXT FROM CCC INTO @FIO, @c;
END;
CLOSE CCC; DEALLOCATE CCC;


-------------------------
имеем в справочнике:
Word Corp Priv

АРБИТРАЖНЫЙ 570 0
ВТОРОЙ 161 0
СУД 1005 0
ГАВРИЛИНА 3 45
ОЛЬГА 291 14024
и т.п.

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


 
[ВладОшин] ©   (2014-03-31 21:45) [45]


> дальше пока не написал :)

написал :)
но нет, надо не так. Переписываю..


 
картман ©   (2014-03-31 22:03) [46]


> Каких признаков больше - то и есть.

да ладно, т.е. "ОАО Алексей Иванов" - частник?


 
[ВладОшин] ©   (2014-03-31 22:40) [47]

ну где же

SELECT sum([Corp]) - sum([Priv])
 FROM [dbo].[Spr_CorpPrivate]
 where word in (
 "ОАО",
 "Алексей",
 "Иванов"
 )

72 260!


 
[ВладОшин] ©   (2014-03-31 22:43) [48]

точнее так надо:

SELECT cast((sum([Corp]) - sum([Priv])) as float) / (sum([Corp]) + sum([Priv]))
 FROM [Coordinates].[dbo].[Spr_CorpPrivate]
 where word in (
 "ОАО",
 "Алексей",
 "Иванов"
 )


 
Styx   (2014-03-31 23:25) [49]


> Ип Ман - китаец такой был, мастер боевых искусств :)
>

С китайцами и прочими азиатами вообще беда, мне в журнал статьи приходят, нужно из полного имени сделать фамилию и инициалы... и... и... и всё :(


 
clickmaker ©   (2014-03-31 23:46) [50]

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


 
[ВладОшин] ©   (2014-03-31 23:50) [51]

ь знак не может быть не в конце :)


 
картман ©   (2014-04-01 00:06) [52]

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


 
й   (2014-04-01 10:42) [53]

[ВладОшин] > ...суммируя признаки. Каких признаков больше - то и есть.

не уверен. я бы предложил попробовать считать среднеарифметическое от Corp/(Corp+Priv)
то есть если у вас в названии будет 2 слова с противоположным соотношением попаданий, но разными частотами употребления, типа
Слово1 10000 100
Слово2 10 1000
то получите (10000+10)/(100+1000) (у вас формула другая и зачем там вычитание я вообще не понял, но суть вроде та же) т.е. гораздо чаще встречающееся слово полностью "задавит" второе
в моём же варианте будет (10000/10100+10/1010)/2 = 0,5 (половинная вероятность попадания в Corp), т.е. противоположные соотношения полностью уравновесили друг друга, несмотря на разные частоты употребления слов

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


 
ВладОшин ©   (2014-04-01 11:08) [54]


> й   (01.04.14 10:42) [53]



>  зачем там вычитание я вообще не понял

все просто: если будет минус, то это ФизЛицо. Плюс - ЮрЛицо.
А величина - вероятность. Да, это не совсем вероятность, в строгом понимании.
Скажем так, это некая количественная оценка, близкая к вероятности.

>> т.е. гораздо чаще встречающееся слово полностью "задавит" второе
да. Это и преследуется.


 
ВладОшин ©   (2014-04-01 11:26) [55]

print [dbo].[IsCorpProbality]("СОЛИКАМСКИЙ ИГОРЬ СЕРГЕЕВИЧ")
-0.919797

но:
print [dbo].[IsCorpProbality]("ИП СОЛИКАМСКИЙ ИГОРЬ СЕРГЕЕВИЧ")
-0.0447461

т.о. я бы не очень доверял abs(оценке) < 0.3 или 0.4

итого
Руководство говорит: Дайте 1000 ФЛ. Или сажаем оператора часа на 2
или
Пишем: select top 1000 .. where .. and IsCorpProbality () < -0.4

или апдейтим таблу по abs(оценке) > 0.3 в зависимости от знака
остальное операторы глазами доотметят. Если надо  всех разобрать.

Но обычно не надо :)
Есть список, тысяч на 50
Достаточно по 10-20 тысяч выбрать, что бы предел нашего "производства" перекрыть


 
й   (2014-04-01 12:43) [56]

ок, главное - эмпирически проверить оптимальность
и тогда уж select top 1000 .. order by IsCorpProbality DESC


 
ВладОшин ©   (2014-04-02 10:17) [57]

это все хорошо, но все равно это все не то...

>> выделение наиболее частых последовательностей
1. СоликамскЗерно, СтравропольЗерно, КазахстанЗерно,
т.е. ххххЗерно
2. ПензаЗерно

как бы сделать так, что бы имея 1 как ЮЛ, определить что 2 тоже ЮЛ?
разумеется, в общем случае


 
turbouser ©   (2014-04-02 10:21) [58]


> [ВладОшин] ©   (31.03.14 23:50) [51]
>
> ь знак не может быть не в конце :)

А как же Лесь, Василь и т.п.?


 
turbouser ©   (2014-04-02 10:27) [59]


> turbouser ©   (02.04.14 10:21) [58]
>
>
> > [ВладОшин] ©   (31.03.14 23:50) [51]
> >
> > ь знак не может быть не в конце :)


Сорри :)
Чукча писатель..


 
ВладОшин ©   (2014-04-02 10:29) [60]

м-да..
товарищи :
Дума А.В.
Мед А.П.
Работа А.М.
Сосна С.П.

с близкой к 100% вероятности - ЮЛ  :)
"X.Y." - тоже как-то надо учитывать..


 
ВладОшин ©   (2014-04-02 10:30) [61]


> turbouser ©   (02.04.14 10:27) [59]

ни че. не каждый не поймет :)


 
ВладОшин ©   (2014-04-02 10:31) [62]


> turbouser ©   (02.04.14 10:27) [59]

к тому же,  я не прав: Лоськин


 
Mystic ©   (2014-10-31 21:05) [63]

Байесовские сети, Бернулли, наверное, чуть лучше. Копать можно в сторону учета сочетаний, ...



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

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

Наверх





Память: 0.63 MB
Время: 0.049 c
15-1413896047
Ellisium
2014-10-21 16:54
2015.09.10
ado при execsql не выдает ошибку?


15-1413029873
Kerk
2014-10-11 16:17
2015.09.10
Orpheus,Abbrevia,VirtualTree,SynEdit,LockBox,AsyncPro,PowerPDF


15-1415447176
dmk
2014-11-08 14:46
2015.09.10
Про переменные


15-1414688410
Rouse_
2014-10-30 21:00
2015.09.10
Вах... вынос мозга :)


15-1418318045
Fox
2014-12-11 20:14
2015.09.10
Англоязычная озвучка карт





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский