Алгоритм определения тематики статьи

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
Имеется папка со статьями в текстовых файлах, - все в куче.
Есть задача, рассортировать статьи по их тематике, т.е. открыть каждый файл, определить тему статьи и переместить ее в соответствующую папку.
Нужно придумать алгоритм определения тематики статьи, при этом необходимо учитывать, что статьи не оптимизированы, т.е. банальный подсчет слов не прокатит - в топе будут слова паразиты или что-то иное, не относящееся к основной теме статьи.

Кто может что посоветовать по созданию такого алгоритма, который бы определял тематику с вероятностью более 90-95%, и как это лучше реализовать на зенке?
Спасибо.
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 264
Баллы
113

svaminar

Client
Регистрация
21.08.2013
Сообщения
834
Благодарностей
378
Баллы
63
Radzhab а прикольно б било такую штуку в зенно добавить. Как есть для анг языка !
 

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
Гм, а нельзя как-то попроще и на зенке?
Чтобы не выныривать из шаба для решения этой задачи...
 

svaminar

Client
Регистрация
21.08.2013
Сообщения
834
Благодарностей
378
Баллы
63
неа. Как по мне так это по божески. В плане сложности реализации можно еще проще но платно
 

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
Нашел на поисковом форуме следующий алгоритм:
  1. Разбиваем все слова по пробелам в массив.
  2. Определяем словоформы (что бы не изобретать велосипед можно воспользоваться mystem).
  3. Подсчитываем количество вхождения для каждого слова с учётом словоформ (в двумерный массив: слово, частота).
  4. Сортируем полученный массив по частотности.
  5. Убираем минус-слова.
  6. Из "верхушки" полученного массива определяем тематику.
Соответственно помогите плиз:
1. Нужна регулярка, которая не только может выбрать слова, но и отбросить все слова меньше 3-х символов.
2. Как можно упростить получение словоформы, какие есть идеи?
6. Не факт что "верхушка" будет чистой от мусора, что с ней можно сделать, чтобы избежать ошибок?
 

budora

Client
Регистрация
13.08.2012
Сообщения
831
Благодарностей
554
Баллы
93
Гм, а нельзя как-то попроще и на зенке?
Чтобы не выныривать из шаба для решения этой задачи...
Если проще то я думаю сервис..
Делал шаблон под ТЫЦ
API есть и есть и вполне сносно определяет.
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 264
Баллы
113
Друзья не парьтесь. На досуге попробую с этой томитой разобраться
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
891
Баллы
113
У самого мануал по томите открыт, но руки не доходят, но судя по всему она способна определять заранее заданные цепочки связанных фактов, а не общую тематику... хотя могу и наврать)

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

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
budora, ТЫЦ за деньги - это не есть гуд, если ставить на поток.

Томито надо вникать, с правилами разбираться.
Было бы хорошо сделать пункты 1-5 и посмотреть что выходит.
 

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
п.6, как вариант: накапливать "верхушку" в "буфере" с частотой и тупо сравнивать совпадения + частоту.
Если совпадения нет, то добавлять с "буфер". Только конечно надо как-то все предварительно от мусора очистить.
 

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 190
Благодарностей
786
Баллы
113
почему такой вариант плохой?
есть база
тематика->регулярка->вес
тематика повторяется, регулярка - уник, вес повторяется
берем текст, матчим его по всем тематикам "реглярками", пока не будем учитывать кол-во а просто будем считать веса и прибавлять к соответствуещей тематике.
собираем тематики и выбираем максимальный результат
 
  • Спасибо
Реакции: Severip

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
891
Баллы
113
да тут как бы проблема исключительно в том что с этой верхушкой потом делать
ну вот будет там допустим

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

Это конечно условный пример - но как вот из этих слов понять что текст о привольной жизни котиков или о невзгодах холодильников?
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
891
Баллы
113
почему такой вариант плохой?
есть база
тематика->регулярка->вес
тематика повторяется, регулярка - уник, вес повторяется
берем текст, матчим его по всем тематикам "реглярками", пока не будем учитывать кол-во а просто будем считать веса и прибавлять к соответствуещей тематике.
собираем тематики и выбираем максимальный результат
Для данной модели необходимо иметь заранее готовую базу тематик и реперных слов...

Severip дайте какой нибудь текст я вам покажу верхушку))))
 

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
Да, так лучше, не надо париться со словоформами.
Только базу тематик собирать, все равно что ключивики подбирать, она же большая получится.
 

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
Lexicon, пожалуйста :-)

Правительство РФ договорилось с ведущими госкомпаниями-экспортерами о продаже в ближайшие два месяца большей части накопленной валюты. Таким образом на рынке ежедневно будет появляться дополнительно около 1 миллиарда долларов, что составляет порядка 25 процентов от его оборота, пишет во вторник, 23 декабря, «Коммерсантъ».

18 декабря, по данным издания, Кабмин обязал пять крупнейших госкомпаний-экспортеров («Газпром», «Роснефть», АЛРОСА, «Зарубежнефть» и производителя бриллиантов — смоленское ПО «Кристалл») и их дочерние структуры довести до 1 марта 2015 года размер валютных активов до уровня, не превышающего показатель на 1 октября 2014 года. Реализовываться распоряжение будет в соответствии с графиком, согласованным с Центробанком.

Официально в госкомпаниях отказались обсуждать существование директивы, источник в одной из них предположил, что речь идет о продаже почти всей валюты, накопленной после 1 октября. По оценке участников валютного рынка, таким образом на рынке может оказаться порядка 40-50 миллиардов долларов, в первую очередь от «Газпрома» и «Роснефти».

Это позволит стабилизировать ситуацию с курсом рубля. В случае падения цен на нефть до 40 долларов за баррель мера будет недостаточной для его удержания, однако при сохранении цен на нынешнем уровне (около 60 долларов) курс российской валюты сможет остаться на текущих позициях и даже укрепиться, отмечают эксперты.

Контролировать действия экспортеров, по сведениям «Коммерсанта», будет специальная рабочая группа во главе с первым вице-премьером Игорем Шуваловым. В группу также вошли представители Минфина, Минэкономики, ФНС, Росфинмониторинга и Центробанка. Также в нее может быть включен начальник управления «К» (подразделение службы экономической безопасности) ФСБ Виктор Воронин.

17 декабря премьер-министр Дмитрий Медведев указал руководителям компаний-экспортеров на необходимость ритмичной и стабильной продажи валютных средств с тем, чтобы не допустить скачков курса рубля. На следующий день президент России Владимир Путин в ходе большой пресс-конференции заявил, что правительство и ЦБ не будут заставлять российских экспортеров продавать валютную выручку в обязательном порядке.
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
891
Баллы
113
Вот список слов отсортированный в порядке убывания в нормальной форме без чистки от стоп слов и прочего
Код:
в - 12
на - 8
и - 7
с - 6
быть - 6
по - 4
1 - 4
валютный - 4
курс - 3
что - 3
не - 3
до - 3
продажа - 3
миллиард - 2
он - 2
накопить - 2
первый - 2
госкомпания-экспортёр - 2
мочь - 2
группа - 2
российский - 2
о - 2
долларов, - 2
рубля. - 2
образ - 2
от - 2
правительство - 2
декабря, - 2
рынок - 2
цена - 2
такой - 2
также - 2
они - 2
порядок - 2
допустить - 1
недостаточный - 1
«коммерсанта», - 1
сведение - 1
появляться - 1
официально - 1
большой - 1
часть - 1
воронин. - 1
60 - 1
пресс-конференция - 1
действие - 1
чтобы - 1
(около - 1
больший - 1
специальный - 1
позволить - 1
один - 1
минфина, - 1
фсб - 1
договориться - 1
текущий - 1
обязать - 1
(подразделение - 1
ситуация - 1
вице-премьер - 1
идти - 1
(«газпром», - 1
— - 1
нефть - 1
валюты, - 1
президент - 1
2014 - 1
глава - 1
следующий - 1
весь - 1
крупный - 1
заявил, - 1
валюты. - 1
день - 1
для - 1
обсуждать - 1
центробанком. - 1
18 - 1
около - 1
март - 1
2015 - 1
позиция - 1
представитель - 1
владимир - 1
«роснефть», - 1
стабильный - 1
путин - 1
дополнительно - 1
нея - 1
остаться - 1
«газпрома» - 1
40-50 - 1
согласовать - 1
директивы, - 1
порядке. - 1
включить - 1
даже - 1
после - 1
23 - 1
стабилизировать - 1
почти - 1
однако - 1
ежедневно - 1
рф - 1
управление - 1
производитель - 1
превышать - 1
реализовываться - 1
писать - 1
госкомпания - 1
«зарубежнефть» - 1
россия - 1
октября. - 1
падение - 1
уровня, - 1
уровень - 1
игорь - 1
тем, - 1
скачок - 1
необходимость - 1
рынка, - 1
25 - 1
пять - 1
процент - 1
компания-экспортёр - 1
цб - 1
очередь - 1
распоряжение - 1
экономический - 1
оценка - 1
издания, - 1
соответствие - 1
продавать - 1
смоленский - 1
выручка - 1
вторник, - 1
премьер-министр - 1
указать - 1
«кристалл») - 1
октябрь - 1
мера - 1
это - 1
размер - 1
укрепиться, - 1
баррель - 1
заставлять - 1
сохранение - 1
экспортеров, - 1
данные - 1
оборота, - 1
минэкономики, - 1
обязательный - 1
отмечать - 1
ритмичный - 1
источник - 1
долларов) - 1
экспортёр - 1
предположил, - 1
ведущий - 1
два - 1
дмитрий - 1
актив - 1
росфинмониторинг - 1
руководитель - 1
кабмина - 1
ход - 1
года. - 1
за - 1
17 - 1
медведев - 1
центробанка. - 1
год - 1
оказаться - 1
40 - 1
«к» - 1
«коммерсантъ». - 1
виктор - 1
эксперты. - 1
войти - 1
при - 1
составлять - 1
рабочий - 1
алроса, - 1
доллар - 1
из - 1
служба - 1
участник - 1
удержания, - 1
графиком, - 1
отказаться - 1
«роснефти». - 1
контролировать - 1
показатель - 1
средство - 1
случай - 1
довести - 1
структура - 1
речь - 1
существование - 1
дочерний - 1
декабрь - 1
шуваловым. - 1
бриллиант - 1
фнс, - 1
начальник - 1
валюта - 1
смочь - 1
месяц - 1
ближний - 1
безопасности) - 1
нынешний - 1
я вот не вижу как из этого венигрета выдернуть тематику)))
 

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 190
Благодарностей
786
Баллы
113
поэтому нужна база ))
конечно лучше написать софт который бы хавал текст с предопределенной тематикой и регулировал веса для нч слов отностилеьно других статей...
через какое-то время набралось бы нужное количество тематик с которымы можно было бы работать
 

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
Ну почему же нет?
Если отбросить все слова в три и меньше символов, то получаем по первым 3 результатам:

быть
валютный
курс
если еще парочку добавить, то:
продажа
миллиард

5 подобных слов в названии файла уже помогут понять о чем идет речь, то есть из названия понятно, что речь идет об интервенциях.
Другое дело, как этому "винегрету" придать человеческое лицо, тут надо подумать.
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
891
Баллы
113
Вот почистил от откровенного хлама типа
{'NPRO', 'ADVB', 'PRED', 'PREP', 'CONJ', 'PRCL', 'INTJ'}
Код:
быть - 6
1 - 4
валютный - 4
продажа - 3
курс - 3
накопить - 2
порядок - 2
госкомпания-экспортёр - 2
первый - 2
декабря, - 2
миллиард - 2
российский - 2
рынок - 2
рубля. - 2
долларов, - 2
мочь - 2
образ - 2
такой - 2
группа - 2
правительство - 2
цена - 2
владимир - 1
вице-премьер - 1
«коммерсантъ». - 1
текущий - 1
экспортёр - 1
управление - 1
бриллиант - 1
включить - 1
17 - 1
соответствие - 1
октябрь - 1
октября. - 1
2015 - 1
премьер-министр - 1
руководитель - 1
ход - 1
существование - 1
крупный - 1
кабмина - 1
«зарубежнефть» - 1
росфинмониторинг - 1
нефть - 1
валюты. - 1
медведев - 1
(«газпром», - 1
войти - 1
центробанком. - 1
следующий - 1
случай - 1
эксперты. - 1
один - 1
обязать - 1
процент - 1
«к» - 1
фнс, - 1
большой - 1
заставлять - 1
сохранение - 1
оборота, - 1
года. - 1
россия - 1
начальник - 1
«кристалл») - 1
долларов) - 1
смоленский - 1
дочерний - 1
день - 1
шуваловым. - 1
составлять - 1
40-50 - 1
путин - 1
«коммерсанта», - 1
порядке. - 1
президент - 1
фсб - 1
уровня, - 1
ритмичный - 1
год - 1
специальный - 1
пять - 1
обязательный - 1
укрепиться, - 1
весь - 1
остаться - 1
отмечать - 1
стабильный - 1
тем, - 1
речь - 1
сведение - 1
25 - 1
выручка - 1
компания-экспортёр - 1
контролировать - 1
средство - 1
служба - 1
оказаться - 1
недостаточный - 1
цб - 1
ведущий - 1
40 - 1
стабилизировать - 1
18 - 1
допустить - 1
ситуация - 1
идти - 1
продавать - 1
2014 - 1
мера - 1
оценка - 1
источник - 1
довести - 1
воронин. - 1
договориться - 1
согласовать - 1
удержания, - 1
действие - 1
вторник, - 1
очередь - 1
распоряжение - 1
23 - 1
графиком, - 1
необходимость - 1
валюта - 1
безопасности) - 1
«роснефти». - 1
рынка, - 1
директивы, - 1
60 - 1
— - 1
(подразделение - 1
экспортеров, - 1
отказаться - 1
превышать - 1
баррель - 1
рабочий - 1
актив - 1
данные - 1
появляться - 1
пресс-конференция - 1
«роснефть», - 1
участник - 1
госкомпания - 1
показатель - 1
игорь - 1
«газпрома» - 1
падение - 1
уровень - 1
смочь - 1
указать - 1
больший - 1
минэкономики, - 1
издания, - 1
размер - 1
март - 1
часть - 1
доллар - 1
валюты, - 1
нынешний - 1
глава - 1
ближний - 1
центробанка. - 1
минфина, - 1
дмитрий - 1
позволить - 1
два - 1
алроса, - 1
структура - 1
производитель - 1
реализовываться - 1
представитель - 1
писать - 1
скачок - 1
заявил, - 1
виктор - 1
предположил, - 1
экономический - 1
декабрь - 1
нея - 1
обсуждать - 1
рф - 1
месяц - 1
позиция - 1
 

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
Гм, может и не нужно было чистить?

Можно считать только те слова, которые имеют больше 2 совпадений - это увеличивает точность определения.
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
891
Баллы
113
Елки))) ну можно конечно))) это просто скрипт на коленке) если надо можно как угодно данные обработать)))
Код:
#coding: utf-8
import pymorphy2
m = pymorphy2.MorphAnalyzer()
collection = {}
vv = 'Правительство РФ договорилось с ведущими госкомпаниями-экспортерами о продаже в ближайшие два месяца большей части накопленной валюты. Таким образом на рынке ежедневно будет появляться дополнительно около 1 миллиарда долларов, что составляет порядка 25 процентов от его оборота, пишет во вторник, 23 декабря, «Коммерсантъ». 18 декабря, по данным издания, Кабмин обязал пять крупнейших госкомпаний-экспортеров («Газпром», «Роснефть», АЛРОСА, «Зарубежнефть» и производителя бриллиантов — смоленское ПО «Кристалл») и их дочерние структуры довести до 1 марта 2015 года размер валютных активов до уровня, не превышающего показатель на 1 октября 2014 года. Реализовываться распоряжение будет в соответствии с графиком, согласованным с Центробанком. Официально в госкомпаниях отказались обсуждать существование директивы, источник в одной из них предположил, что речь идет о продаже почти всей валюты, накопленной после 1 октября. По оценке участников валютного рынка, таким образом на рынке может оказаться порядка 40-50 миллиардов долларов, в первую очередь от «Газпрома» и «Роснефти». Это позволит стабилизировать ситуацию с курсом рубля. В случае падения цен на нефть до 40 долларов за баррель мера будет недостаточной для его удержания, однако при сохранении цен на нынешнем уровне (около 60 долларов) курс российской валюты сможет остаться на текущих позициях и даже укрепиться, отмечают эксперты. Контролировать действия экспортеров, по сведениям «Коммерсанта», будет специальная рабочая группа во главе с первым вице-премьером Игорем Шуваловым. В группу также вошли представители Минфина, Минэкономики, ФНС, Росфинмониторинга и Центробанка. Также в нее может быть включен начальник управления «К» (подразделение службы экономической безопасности) ФСБ Виктор Воронин. 17 декабря премьер-министр Дмитрий Медведев указал руководителям компаний-экспортеров на необходимость ритмичной и стабильной продажи валютных средств с тем, чтобы не допустить скачков курса рубля. На следующий день президент России Владимир Путин в ходе большой пресс-конференции заявил, что правительство и ЦБ не будут заставлять российских экспортеров продавать валютную выручку в обязательном порядке.'
words = vv.split(' ')
needles = {'NPRO', 'ADVB', 'PRED', 'PREP', 'CONJ', 'PRCL', 'INTJ'}
for x in words:
    #x = m.parse(x)[0].normal_form
    x = m.parse(x)[0]
    word = x.normal_form
    typ = x.tag.POS
    if not typ in needles:
        if word in collection:
            collection[word] += 1
        else:
            collection[word] = 1
srt = sorted([(x, collection[x]) for x in collection], key = lambda x:x[1], reverse=True)
for x in srt:
    print('%s - %s' % (x[0],  x[1]))
 

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
поэтому нужна база ))
конечно лучше написать софт который бы хавал текст с предопределенной тематикой и регулировал веса для нч слов отностилеьно других статей...
через какое-то время набралось бы нужное количество тематик с которымы можно было бы работать
Опираться на другие статьи мы можем только в том случае, если работаем по какому-то направлению.
Изначально в папке имеем статьи и про котиков, и про ракеты, и про политику - их надо разложить по тематическим папкам.

Подумалось, может реализовать принцип тегов?
В нашем примере есть 5 слов:

быть
валютный
курс
продажа
миллиард

Соответственно создается 5 папок с соответствующими названиями, куда и помещается статья (5 папок = 5 копий статей).
В файле со статьей в самом начале помещать метку с ключами, чтобы знать в каких папка она еще есть, что-то вроде:
%быть%
%валютный%
%курс%
%продажа%
%миллиард%
После использования статьи по какому-то слову, например, "валютный" - парсятся метки и статья удаляется из всех указанных папок.
Чтобы уменьшить количество дублей, можно провести удаление папок по стоп словам, например как у нас "быть".
Какие-то папки может быть получится объединить, например: "валютный" и "курс", соответственно дубли в них убить.

Вариант?
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
891
Баллы
113
мммм вообще на самом деле вариант, все равно не понятно, как упаковывать тексты в человекопонятное - "Про котиков" но если взять ваш метод и немного его доработать добавив % вероятности вхождения одной группы в другую то получатся довольно большие папки про некоторые метки разом, которые практически наверняка будут тематически очень близки.
 

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 190
Благодарностей
786
Баллы
113
допустим у нас есть 5 текстов из определенной тематики
мы можем найти в них наиболее часто встречающиеся слова, выставляем им веса в зависимости от частоты.
берем друге 5 текстов с другой тематикой, делаем тоже самое
...
проводим анализ по пресекающимся ключевикам из разных тематик и понижаем их вес до соотв. уровня в зависимости от частоты пересечений.
все это в идеале когда слова приведены к граматическому началу (хотябы без окончаний)
вобще мне кажется я рассматриваю вариант когда тематики заданы изначально. то есть мы выбираем тематику из конечного множества тематик.
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
891
Баллы
113
в общем наметилось два методологических подхода)))) мне вот ближе приемы кластеризации а вам классификация))))
 

7make

Client
Регистрация
25.06.2011
Сообщения
1 547
Благодарностей
1 310
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с 7make какие-либо сделки.

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

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
891
Баллы
113
как раз выше я приводил пример скрипта в котором производится эта процедура при помощи библиотеки pymorphy2)))

Пы.Сы. а хотя да))) накосячил я с точками и запятыми да и прочими знаками препинания на концах слов)
 

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
Можно отрезать у слов по 2-3 последних символа, если количество знаков в нем больше 7.
По факту с вероятностью более 80% останется неизменяемая часть слова, что сократит количество дублей однокоренных слов.

В примере сократится 3 слова:
валют
прода
миллиа

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

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
Итак, что имеем.
  1. Разбиваем все слова по пробелам в массив.
  2. Убиваем все, что меньше 3-х символов включительно.
  3. У слов в 7 знаков убиваем 2 последних символа, у слов 7+ убиваем 3 последних символа.
  4. Подсчитываем количество вхождений для каждого слова (в двумерный массив: слово, частота).
  5. Убираем минус-слова.
  6. Сортируем полученный массив по частотности.
  7. Из полученного массива берем слова с частотой совпадения 3(4)+ раз, создаем по типу тегов одноименные папки.
  8. В папки раскладываем обработанную статью в заголовке которой будут присутствовать метки с другими ключами, чтобы по ним производить в дальнейшем удаление использованных статей.
Как это "малой кровью" реализовать именно на зенке?
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)