Имя Роман

91 views
Skip to first unread message

guk...@gmail.com

unread,
Jul 1, 2014, 6:41:17 AM7/1/14
to pymo...@googlegroups.com
Анализатор считает, что Роман - это скорее фамилия, нежели имя.
>> sum([parse.score for parse in morph.parse('Роман') if 'Surn' in parse.tag])
0.5833333333333333
>> sum([parse.score for parse in morph.parse('Роман') if 'Name' in parse.tag])
0.25

Mikhail Korobov

unread,
Jul 1, 2014, 7:15:20 AM7/1/14
to pymo...@googlegroups.com, guk...@gmail.com
pymorphy2 считает все варианты разбора равновероятными, т.к. в части OpenCorpora со снятой неоднозначностью ни разу не встречалось ни имя Роман, ни фамилия Роман, ни слово роман:

In [3]: m.parse('Роман')
Out[3]:
[Parse(word='роман', tag=OpencorporaTag('NOUN,anim,masc,Name sing,nomn'), normal_form='роман', score=0.08333333333333333, methods_stack=((<DictionaryAnalyzer>, 'роман', 25, 0),)),
 Parse(word='роман', tag=OpencorporaTag('NOUN,anim,masc,Sgtm,Surn sing,nomn'), normal_form='роман', score=0.08333333333333333, methods_stack=((<DictionaryAnalyzer>, 'роман', 27, 0),)),
 Parse(word='роман', tag=OpencorporaTag('NOUN,anim,femn,Sgtm,Fixd,Surn sing,nomn'), normal_form='роман', score=0.08333333333333333, methods_stack=((<DictionaryAnalyzer>, 'роман', 27, 6),)),
 Parse(word='роман', tag=OpencorporaTag('NOUN,anim,femn,Sgtm,Fixd,Surn sing,gent'), normal_form='роман', score=0.08333333333333333, methods_stack=((<DictionaryAnalyzer>, 'роман', 27, 7),)),
 Parse(word='роман', tag=OpencorporaTag('NOUN,anim,femn,Sgtm,Fixd,Surn sing,datv'), normal_form='роман', score=0.08333333333333333, methods_stack=((<DictionaryAnalyzer>, 'роман', 27, 8),)),
 Parse(word='роман', tag=OpencorporaTag('NOUN,anim,femn,Sgtm,Fixd,Surn sing,accs'), normal_form='роман', score=0.08333333333333333, methods_stack=((<DictionaryAnalyzer>, 'роман', 27, 9),)),
 Parse(word='роман', tag=OpencorporaTag('NOUN,anim,femn,Sgtm,Fixd,Surn sing,ablt'), normal_form='роман', score=0.08333333333333333, methods_stack=((<DictionaryAnalyzer>, 'роман', 27, 10),)),
 Parse(word='роман', tag=OpencorporaTag('NOUN,anim,femn,Sgtm,Fixd,Surn sing,loct'), normal_form='роман', score=0.08333333333333333, methods_stack=((<DictionaryAnalyzer>, 'роман', 27, 11),)),
 Parse(word='роман', tag=OpencorporaTag('NOUN,inan,masc sing,nomn'), normal_form='роман', score=0.08333333333333333, methods_stack=((<DictionaryAnalyzer>, 'роман', 32, 0),)),
 Parse(word='роман', tag=OpencorporaTag('NOUN,inan,masc sing,accs'), normal_form='роман', score=0.08333333333333333, methods_stack=((<DictionaryAnalyzer>, 'роман', 32, 3),)),
 Parse(word='роман', tag=OpencorporaTag('NOUN,anim,femn,Name plur,gent'), normal_form='романа', score=0.08333333333333333, methods_stack=((<DictionaryAnalyzer>, 'роман', 68, 8),)),
 Parse(word='роман', tag=OpencorporaTag('NOUN,anim,femn,Name plur,accs'), normal_form='романа', score=0.08333333333333333, methods_stack=((<DictionaryAnalyzer>, 'роман', 68, 10),))]

Есть идеи, как сделать лучше? Если просуммировать вероятности для форм с Surn получится больше, т.к. возможных форм с Surn больше.

Чтоб улучшить оценку, можно попробовать не только вероятности для отдельных форм слов оценивать (как сейчас сделано), но и вероятности для классов слов (например, что чаще встречется - имя или неизменяемая фамилия, если у формы есть такая неоднозначность?). Это сейчас не реализовано.

вторник, 1 июля 2014 г., 16:41:17 UTC+6 пользователь guk...@gmail.com написал:

guk...@gmail.com

unread,
Jul 1, 2014, 7:16:14 AM7/1/14
to pymo...@googlegroups.com, guk...@gmail.com
Есть также проблемы с фамилиями, заканчивающимися на "ин": Колодин, Сиротин. Видимо, словарь достаточно беден.
Сейчас я решаю задачу, где три данных слова выставляю в порядке ФИО. Для этого использую схему максимального правдоподобия, пользуясь оценками pymorhpy2.
Видимо, словарь имён достаточно беден. Я занимаюсь социальными исследованиями, и у меня есть довольно полный набор различных ФИО. Могу ли я на их основе изменить вероятности в своём словаре pymorphy? Было бы здорово, если бы это также влияло на работу предсказателя. (То же слово Сиротин не считается фамилией, хоть и имеет соответствующее окончание и большую первую букву)

Kostya Gukoff

unread,
Jul 1, 2014, 7:42:18 AM7/1/14
to pymo...@googlegroups.com, guk...@gmail.com
Лично для моей задачи иногда можно использовать информацию о полах, и брать в расчёт только формы nom, увеличивая вес для троек, где пол имени/фамилии/отчества совпадает.
Вообще же здесь отлично бы отработал классификатор c правильно подобранными фичами, но тратить много времени, чтобы подружить анализ текстов с питоном, не хочется: эта задача для меня сейчас совершенно второстепенна.
Пока же я попробую воспользоваться своим набором имён в дополнение к pymorphy.

Yuri Baburov

unread,
Jul 1, 2014, 9:20:23 AM7/1/14
to pymo...@googlegroups.com, guk...@gmail.com
Привет,

я думаю, вам будет проще всего настроить наивный байесов классификатор 
Настройте, чтобы по слову он предсказывал три класса: вероятность того, что это фамилия, что это имя, и что это отчество. Потом берёте и сортируете так же, как вы это делаете сейчас.
Возьмите следующие фичи:
окончания (последние две и последние три буквы) и полное слово.
-вич , -вна однозначно отчества
-ин, -ян, -ан, -ов, -ев, -ова, -ева — фамилии
а имена все в списке будут.



--
Вы получили это сообщение, поскольку подписаны на группу "pymorphy".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес pymorphy+u...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--
Best regards, Yuri V. Baburov, Skype: yuri.baburov

Kostya Gukoff

unread,
Jul 1, 2014, 9:45:40 AM7/1/14
to pymo...@googlegroups.com, guk...@gmail.com
Ну да, в итоге я набросал кое-что навроде наивного Байеса, статистики, благо, хватает почти что на все существующие варианты. Для ненайденных поставил pymorphy, кое-где он справляется. Самому с фичами заморачиваться кажется лишним, да и с ними на самом деле всё не так просто, как кажется. Есть Оличи, есть разные -оглы, есть тот же Роман. Но вот pymorphy такие простенькие эвристики по фамилиям не помешают :)

Yuri Baburov

unread,
Jul 1, 2014, 10:16:42 AM7/1/14
to pymo...@googlegroups.com, Kostya Gukoff
Если добавить в pymorphy больше имён, фамилий и отчеств, то система сможет их лучше предсказывать по 5 последним буквам, как она сейчас и делает.
Правда, сейчас нет деления на такие подклассы.
А вообще, мне кажется, нужно попросить у OpenCorpora добавить эти записи в базу, предоставив базу популярных имён, фамилий и отчеств (которые не являются одновременно другими словами). Почему бы и нет.

Mikhail Korobov

unread,
Jul 1, 2014, 1:57:39 PM7/1/14
to pymo...@googlegroups.com, guk...@gmail.com
Да, я согласен, что pymorphy нужен спец. анализатор для фамилий, который бы предсказывал слово как фамилию, если оно начинается с большой буквы (и, наверное, если оно похоже на фамилию). Все фамилии в словарь добавить нереально. Большинство имен и отчеств в словаре должно уже быть, по крайней мере из СССР. Западные имена было бы очень хорошо в OpenCorpora добавить.

Изменить вероятности - наверное, можно, хотя сходу не соображу, как конкретно. По коду - там есть класс
SingleTagProbabilityEstimator (
https://github.com/kmike/pymorphy2/blob/master/pymorphy2/analyzer.py#L62 ), который вероятности назначает; можно в конструктор MorphAnalyzer свой подобный класс передать.

А не поделитесь набором ФИО?

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

вторник, 1 июля 2014 г., 19:45:40 UTC+6 пользователь Kostya Gukoff написал:

Yuri Baburov

unread,
Jul 1, 2014, 3:13:10 PM7/1/14
to pymo...@googlegroups.com, Kostya Gukoff
Миша, привет,

https://dl.dropboxusercontent.com/u/27900527/names.txt — список имён
из статьи. Из 966 не хватает 96 (ровно 10%).

import urllib
from pymorphy2 import MorphAnalyzer

ma = MorphAnalyzer()

pos, neg = 0, 0
names = urllib.urlopen('https://dl.dropboxusercontent.com/u/27900527/names.txt').read()
names = names.decode('utf-8')
for n in names.split():
if not n in ['m', 'f']:
#print n
if any(['Name' in p.tag for p in ma.parse(n)]):
pos += 1
else:
neg += 1

print 'pos=', pos, 'neg=', neg, 'total=', (pos + neg)
выдаёт:
pos= 870 neg= 96 total= 966



>брать классификатор, который не подразумевает условной независимости фич (логистическую регрессию, например).
Да, кстати, есть такой нюанс, наивный байес будет немного косячить с
предложенными мной фичами.

Kostya Gukoff

unread,
Jul 2, 2014, 8:24:19 AM7/2/14
to pymo...@googlegroups.com, guk...@gmail.com
Предоставить полный набор ФИО не могу, да и для составления словаря имён там слишком много. Могу дать какой-нибудь топ или нейтральную статистику, не раскрывающую набор(выше писали про 5 последних букв). К тому же для морфологического анализа не так важны целые ФИО, скорее 3 отдельные статистики. Напишите, что именно интересует, на какой объём рассчитываете.

Serge Slepov

unread,
Jul 2, 2014, 12:39:35 PM7/2/14
to pymo...@googlegroups.com, guk...@gmail.com
Костя, а какую задачу (задачи) вы решаете?

Kostya Gukoff

unread,
Jul 2, 2014, 1:45:02 PM7/2/14
to pymo...@googlegroups.com, guk...@gmail.com
О задаче я писал выше: у меня есть строка, в которой написано имя человека, а также зачастую фамилия и отчество. Я выделяю, какое слово чему соответствует.
Занимаюсь я совсем другим проектом, а эта задача возникла, потому как в выборке людей иногда имя написано как попало. Случаи редкие и были сполна покрыты статистикой, так что задачу я уже решил. Возникни какие-нибудь проблемы, обучил бы по-быстрому контекстно-зависимый классификатор, который бы по фичам текущего слова и остальных раздавал ему нужные вероятности. Проблем не возникло, так что усложнять ничего не пришлось.
Кстати, почему логистическая регрессия не требует независимости фич? Должна ведь, по-хорошему. Нелинейная корреляция может очень ударить по качеству, тут менее чувствительным будет какой-нибудь desision tree.

Mikhail Korobov

unread,
Jul 3, 2014, 6:30:54 AM7/3/14
to pymo...@googlegroups.com, guk...@gmail.com


среда, 2 июля 2014 г., 18:24:19 UTC+6 пользователь Kostya Gukoff написал:
Предоставить полный набор ФИО не могу, да и для составления словаря имён там слишком много. Могу дать какой-нибудь топ или нейтральную статистику, не раскрывающую набор(выше писали про 5 последних букв). К тому же для морфологического анализа не так важны целые ФИО, скорее 3 отдельные статистики. Напишите, что именно интересует, на какой объём рассчитываете.

Я, по правде сказать, и не знаю, что именно нужно. Задачу можно по-разному решать, всякие данные могут оказаться полезными. Случайная выборка, например. Если еще информация о поле есть, то совсем замечательно.

Юре за список имен, кстати, спасибо, не видел его раньше.
 
Reply all
Reply to author
Forward
0 new messages