Giter Club home page Giter Club logo

rutermextract's Introduction

rutermextract

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

Установка

pip install rutermextract

Использование

>>> from rutermextract import TermExtractor
>>> term_extractor = TermExtractor()
>>> text = u'Съешь ещё этих мягких французских булок да выпей же чаю.'
>>> for term in term_extractor(text):
>>>    print term.normalized, term.count
мягкие французские булки 1
чай 1

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

Возможные применения

  • Автоматическое присвоение тегов.
  • Вычисление похожести текстов на основе извлеченных ключевых слов.

Вызов библиотеки

Аргументы при вызове экземпляра класса TermExtractor:

  • text — текст.
  • (опционально) limit — максимальное количество извлечённых ключевых слов. По умолчанию ограничения нет.
  • (опционально) nestedTrue, если нужно ивзлекать ключевые слова, лежащие внутри других ключевых слов. Например, вместе с «функциональный язык программирования» извлекаются «язык программирования» и «программирование».
  • (опционально) weight — функция для вычисления веса извлеченного ключевого слова. В нее передается объект типа Term. По умолчанию ключевые слова упорядочиваются по количеству употреблений, затем по количеству слов.
  • (опционально) stringsTrue, если результатом вызова должен быть список нормализованных строк. По умолчанию возвращается список объектов типа Term.

Term имеет следующие свойства: words (список слов), word_count (количество слов), normalized (тёрм в виде нормализованной строки), count — количество употреблений.

Пример использования функции веса

>>> from rutermextract import TermExtractor
>>> term_extractor = TermExtractor()
>>> text = ...
>>> idf = ...  # Словарь соответствия ключевых слов их обратным частотам.
>>> terms = term_extractor(text, weight=lambda term: idf.get(term.normalized, 1.0) * term.count)

Зависимости

  • Python 2.6+ или 3.3+.
  • pymorphy2.
  • enum34 (для версий ниже 3.4).

Качество работы

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

Основные проблемы:

  1. Неполные правила. Например, сейчас не извлекаются ключевые слова, содержащие предлоги («вор в законе», «сосед по парте»). Эта проблема может решаться при дальнейшем развитии библиотеки, но правил, покрывающих все случаи всё равно быть не может.
  2. Неоднозначность при морфологическом разборе. Сейчас она разрешается выбором наиболее вероятного варианта, что в некоторых случаях неверно. Проблема может проявляться как при извлечении ключевых слов, так и при их нормализации. (Например, из заголовка «Мальчика назвали в честь нападающего футбольного клуба» будет извлечена фраза «нападающий футбольный клуб».)
  3. Ложные ключевые слова. Некоторые извлеченные фразы могут не являться на самом деле ключевыми. Размера текста не всегда бывает достаточно для того, чтобы отличить важные для текста слова от неважных, основываясь только на количестве употреблений. Поэтому необходимо использовать сторонние модели (например, tf-idf) для определения важности ключевых слов.

Обратная связь

Буду рад услышать предложения по улучшению или сообщения о багах в issues или по почте.

Лицензия

MIT

rutermextract's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rutermextract's Issues

OpenCorpora.ort

В статье rutermextract 0.3 Вами указано, что

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

Рассматривали ли Вы проект opencorpora.org?
Какие препятствия на пути его использования Вы видите?

Не "разрывать" пары Имя Фамилия

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

Фраза:

Украина с 00:00 понедельника перешла на карантинные ограничения, которые действовали в стране до 8 января, сообщил министр здравоохранения Максим Степанов в ходе пресс-брифинга в Киеве в понедельник.

При разбивке на ключевые слова вернет:
понедельник 2
ход пресс-брифинга 1
министр здравоохранения 1
карантинные ограничения 1
8 января 1
украина 1
страна 1
степанов 1
максим 1
киев 1

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

Случайный падеж слов в term.words

Я установил библиотеку rutermextract-0.3 при помощи pip на Ubuntu-18.04, Python 3.6.
Запустил для проверки на рабочей книге. Всё выполнилось без проблем.
Просматривая возвращённый массив терминов terms, обнаружил, что слова в массиве term.words не всегда эквивалентны словам в term.normalized. Т.е. слова те же, но могут стоять в другом падеже.
Выглядит так, что вхождения, найденные в тексте, остались в массиве в исходном виде, без нормализации.
А теперь код:

# In[]:
from rutermextract import TermExtractor
term_extractor = TermExtractor()
with open('texts/patterns.txt', "r", newline="") as file:
    txt = file.read();
terms = list(term_extractor(txt))
print(len(terms), 'terms total')
# Out[]: 4534 terms total

# In[]:
for term in terms:
    print("'%-30s'" % term.normalized, term.word_count, list(map(str, term.words)))
# Out[]: (выдержки из вывода:)
состояние            words: ['состояние']
программа            *words: ['программу']*
команда              words: ['команда']
код                  *words: ['кода']*
подклассы            *words: ['подклассами']*
друг                 *words: ['другом']*
пример               *words: ['примере']*
запрос               words: ['запрос']
# ...
цепочка обязанностей words: ['цепочка', 'обязанностей']
конкретные классы    *words: ['конкретных', 'классов']*
другая сторона       *words: ['другой', 'стороны']*
такие образ          *words: ['таким', 'образом']*
базовый класс        *words: ['базовом', 'классе']*
другие объекты       *words: ['других', 'объектов']*
сервисный объект     *words: ['сервисного', 'объекта']*
состояние редактора  words: ['состояние', 'редактора']
# ... и т.д.

P.S. Думаю, это не является большой проблемой, т.к. со своей задачей библиотека справляется хорошо. Огромное спасибо автору за его труд!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.