Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.09.10;
Скачать: CL | DM;

Вниз

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

 
[ВладОшин] ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.64 MB
Время: 0.117 c
15-1413787824
Дмитрий С
2014-10-20 10:50
2015.09.10
Посоветуйте, пожалуйста, редактор для sqlite баз.


15-1417444886
Trylok
2014-12-01 17:41
2015.09.10
Перевести на английский


15-1416776457
ВладОшин
2014-11-24 00:00
2015.09.10
Шахматы, задачка


15-1413131612
картман
2014-10-12 20:33
2015.09.10
эхо


1-1332746450
CRLF
2012-03-26 11:20
2015.09.10
Подружить IXMLDOMDocument2 и MS SQL XML