Перейти к содержимому

Как получить список ключевых слов в python

  • автор:

Keyword Extraction Techniques using Python

Ajay John Alex

K eyword extraction is tasked with the automatic identification of terms that best describe the subject of a document. Keywords are the terms that represent the most relevant information contained in the document.
Methods for automatic keyword extraction can be supervised, semi-supervised, or unsupervised.
In research & news articles, keywords form an important component since they provide a concise representation of the article’s content.

The idea behind writing this article is to shift from the normal norm and share some additional information along with the existing information.The article is written in the form of question and answers to cover all the related topics and common questions regarding this topic.

In this article we would talk about a supervised method : TF-IDF and an unsupervised method : LDA.

Prerequisites : Basic understanding of Sklearn library would be an added benefit .But still examples with code are given to get a better idea on topics .

For our supervised learning approach certain concepts need to be understood . They have been explained in depth with examples of code. Now to extract keyword from plain text we need to tokenize each word and encode the words to build a vocabulary so that the extraction can be started .So certain concepts are explained so that you have a better idea of the main methods.

Concept of BAG-OF-WORDS
According to wiki Bag of Words is a simplifying representation used in natural language processing and information retrieval (IR). In this model, a text (such as a sentence or a document) is represented as the bag (multiset) of its words, disregarding grammar and even word order but keeping multiplicity.Example:

“it was the worst of times” = [1, 1, 1, 0, 1, 1, 1, 0, 0, 0]
“it was the age of wisdom” = [1, 1, 1, 0, 1, 0, 0, 1, 1, 0]
“it was the age of foolishness” = [1, 1, 1, 0, 1, 0, 0, 1, 0, 1]

Concept of Count Vectoriser
The CountVectorizer provides a simple way to both tokenize a collection of text documents and build a vocabulary of known words, but also to encode new documents using that vocabulary.

Q. Why can’t we extract the keywords using Count Vectoriser method ?
A. The problem with Count Vectoriser method is that it gives equal importance to all words i.e. in a document about “equality for all”. The word “it” would have same weight as “equality”. But the word “it” doesn’t give any extra information about the document.

1. TF-IDF

TF-IDF stands for Term Frequency and Inverse Term Frequency . This method helps understand the importance of a word in a document.
The Wiki definition for TF-IDF is that its a numerical statistic that is intended to reflect how important a word is to a document in a collection or corpus. It is often used as a weighting factor in searches of information retrieval, text mining, and user modeling.

Now let’s break it down a bit :

1.1. TERM FREQUENCY(TF)
Term frequency
is the number of times a given term or query appears within a document. It is calculated as :

Here n represents the no of times the term has occurred and is divided by the total no of terms in a document.

1.2. INVERSE DOCUMENT FREQUENCY(IDF)
It is computed as the logarithm of the number of the documents in the corpus divided by the number of documents where the specific term appears. It is calculated as :

Here n is the total no of documents and is divided by the no of documents containing the term.

1.3.TERM FREQUENCY- INVERSE DOCUMENT FREQUENCY (TF-IDF)
It is just the multiplication of the above given two terms .It is represented by :

Q. But how does TF-IDF help in keyword Extraction? Why isn’t TF or IDF on its own efficient enough to extract keywords?
A. The working of TF-IDF in keyword extraction can be better understood with an example:
Let’s assume there is are 10 documents which talk about football . Now this would have lots of common words like “a”, “the” etc and would have “Pele” in it and maybe certain less frequent words like “supercalifragilisticexpialidocious” which is a term “fantastic or fabulous”.

Now if we go by term frequency for keyword extraction , obviously the terms a would have higher count than Pele or rare words . Eg:

Term Frequency:
a -100
Pele -12
Supercalifragilisticexpialidocious -1
So term frequency in itself doesn’t help in extracting keyword as by this method the word “a” gets the most importance

One interesting thought might be, that if we take inverse of these document then the importance of word “Pele” would increase , so lets try IDF:

Inverse Term Frequency:
a -log(10/10)=0
Pele -log(10/4)=0.397
Supercalifragilisticexpialidocious -log(10/1)=1
So IDF in itself doesn’t help in extracting keyword as its would give importance to rarely used words. Hence TF and IDF on its own is not that efficient .

But now lets see how would they work collectively as TF-IDF:

TF-IDF = TF * IDF
TF-IDF:
a -100*0 = 0
Pele -12*0.397 = 4.775
Supercalifragilisticexpialidocious -1*1 = 1
Here we can see that by TF-TDF words like “Pele” gets more importance as the documents are talking about football.Hence TF-IDF is efficient in keyword extraction.

To have a better understanding of keyword extraction using TF-IDF check this code. And to check its implementation visit here.

2. Latent Dirichlet allocation(LDA)

LDA stands for Latent Dirichlet allocation and is used for Topic Modelling. Now Topic Modelling is the task of using unsupervised learning to extract the main topics (represented as a set of words) that occur in a collection of documents.
So the main topics extracted using LDA would be our keywords .

Q . What is LDA ?
A. According to definition :
Latent Dirichlet allocation is a generative statistical model that allows sets of observations to be explained by unobserved groups that explain why some parts of the data are similar.
In simpler words :
LDA imagines a fixed set of topics. Each topic represents a set of words. And the goal of LDA is to map all the documents to the topics in a way, such that the words in each document are mostly captured by those imaginary topics.
Now LDA works with 2 assumptions :
1.That the topics are made from a collection of words frequently used together.
2.That the documents are produced from a mixture of topics. Those topics then generate words based on their probability distribution.
As LDA is unsupervised learning method so the topics are to interpreted by us.

LDA assumes→Each Document →Mixture of topics →Each Topic →Mixture of words

If you are still confused do add it in comment section and if you are looking for a video explanation then watch this. But if you understood ….let’s carry on.

Q. How does LDA work ?

A. Now lets understand this with an example. Now if our input is say dataframe column of 1000 documents eg: df[‘Description’] ,then using Count Vectoriser or TF-IDF Vectoriser we get a document term matrix.

What is a Document term matrix(dtm) ?
A dtm is a matrix that describes the frequency of terms that occur in a collection of documents.

Once a dtm is created , we get a shape of (1000,no_of_unique_words).Then we can use scikit learn’s Latent Dirichlet Allocation library to specify the no of components(topics) we think the documents might have . Using the fit method of LDA we get shape of (no_of_topic,no_of_unique_words).

By using the For loop we are extracting the top words in each topic . These top words are the keywords for each topics . And these top words gives us information about these documents . So if we have a document on action movie review , the top words would be

After executing this code we get 5 list with each with the length of [no_of_unique_words] ordered from most important to least important word in the topic. So thus we can get the topic words from all topics that would create our keywords. For a more in depth article on LDA refer this.

LDA is also used for classification. An example for that could be seen at this code.

If there are any queries regarding this article, please do add them in the comments section. I would love to answer them as soon as possible. I would also be making sufficient changes in the article accordingly.

Ключевые слова Python

Ключевые слова Python — это зарезервированные слова. Они используются интерпретатором Python для понимания программы. Ключевые слова определяют структуру программ. Мы не можем использовать ключевые слова для именования программных объектов, таких как переменные, классы и функции.

Сколько ключевых слов в Python?

У Python много ключевых слов. Их число продолжает расти с появлением новых функций в Python.

Python 3.7.3 — текущая версия на момент написания этого руководства. В версии Python 3.7.3 — 35 ключевых слов.

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

Python список ключевых слов

Основное представление о назначении и использовании этих ключевых слов.

Номер Keyword Описание Пример
1 False экземпляр класса bool. x = False
2 class ключевое слово для определения класса class Foo: pass
3 from предложение для импорта класса из модуля from collections import OrderedDict
4 or Boolean оператор x = True or False
5 None экземпляр объекта NoneType x = None
6 continue оператор continue, используемый во вложенном цикле for и while. Он продолжается со следующего цикла ближайшей замкнутой петли. numbers = range(1,11) for number in numbers: if number == 7: continue
7 global глобальный оператор позволяет нам изменять переменные вне текущей области видимости. x = 0 def add(): global x x = x + 10 add() print(x) # 10
8 pass Оператор Python pass используется для того, чтобы ничего не делать. Это полезно, когда нам требуется какой-то оператор, но мы не хотим выполнять какой-либо код. def foo(): pass
9 True экземпляр класса bool x = True
10 def ключевое слово, используемое для определения функции def bar(): print(“Hello”)
11 if оператор if используется для записи блока условного кода x = 10 if x%2 == 0: print(“x is even”) # prints “x is even”
12 raise Оператор raise используется для создания исключений в программе def square(x): if type(x) is not int: raise TypeError(“Require int argument”) print(x * x)
13 and Логические операторы и операции x = True y = False print(x and y) # False
14 del Ключевое слово del используется для удаления таких объектов, как переменные, список, объекты и т. д. s1 = “Hello” print(s1) # Hello del s1 print(s1) # NameError: name ‘s1’ is not defined
15 import Оператор import используется для импорта модулей и классов в нашу программу # importing class from a module from collections import OrderedDict # import module import math
16 return Оператор return используется в функции для возврата значения def add(x,y): return x+y
17 as Ключевое слово Python as используется для предоставления имени для импорта, кроме оператора и оператора with from collections import OrderedDict as od import math as m with open(‘data.csv’) as file: pass # do some processing on file try: pass except TypeError as e: pass
18 elif Оператор elif всегда используется вместе с оператором if для операции «else if» x = 10 if x > 10: print(‘x is greater than 10’) elif x > 100: print(‘x is greater than 100’) elif x == 10: print(‘x is equal to 10’) else: print(‘x is less than 10’)
19 in Python в Ключевое слово используется, чтобы проверить членство l1 = [1, 2, 3, 4, 5] if 2 in l1: print(‘list contains 2’) s = ‘abcd’ if ‘a’ in s: print(‘string contains a’)
20 try Оператор try используется для написания кода обработки исключений x = ” try: i = int(x) except ValueError as ae: print(ae) # invalid literal for int() with base 10: ”
21 assert Оператор assert позволяет нам вставлять отладочные утверждения в программу. Если утверждение верно, программа продолжает работать. В противном случае выбрасывается AssertionError. def divide(a, b): assert b != 0 return a / b
22 else Оператор else используется с условиями if-elif. Он используется для выполнения операторов, когда ни одно из предыдущих условий не является истинным if False: pass else: print(‘this will always print’)
23 is Ключевое слово Python is используется для проверки того, ссылаются ли две переменные на один и тот же объект. Это то же самое, что использовать оператор== fruits = [‘apple’] fruits1 = [‘apple’] f = fruits print(f is fruits) # True print(fruits1 is fruits) # False
24 while Оператор while используется для выполнения блока операторов до тех пор, пока выражение не станет истинным i = 0 while i < 3: print(i) i+=1 # Output # 0 # 1 # 2
25 async Новое ключевое слово, введенное в Python 3.5. Это ключевое слово всегда используется в теле функции couroutine. Он используется с модулем ввода-вывода и await import asyncio import time async def ping(url): print(f’Ping Started for ’) await asyncio.sleep(1) print(f’Ping Finished for ’) async def main(): await asyncio.gather( ping(‘askpython.com’), ping(‘python.org’), ) if __name__ == ‘__main__’: then = time.time() loop = asyncio.get_event_loop() loop.run_until_complete(main()) now = time.time() print(f’Execution Time = ’) # Output Ping Started for askpython.com Ping Started for python.org Ping Finished for askpython.com Ping Finished for python.org Execution Time = 1.004091739654541
26 await Новое ключевое слово в Python 3.5 для асинхронной обработки Above example demonstrates the use of async and await keywords.
27 lambda Ключевое слово lambda используется для создания лямбда-выражений multiply = lambda a, b: a * b print(multiply(8, 6)) # 48
28 with Python с заявлением используется, чтобы обернуть выполнения блока с методами, определенными в контексте менеджера. Объект должен реализовывать функции__ enter _ _ () и _ _ exit__ () with open(‘data.csv’) as file: file.read()
29 except except используется для перехвата исключений, брошенных в блоке try, и их обработки Please check the try keyword example.
30 finally Оператор finally используется с операторами try-except. Код в блоке finally всегда выполняется. Он в основном используется для закрытия ресурсов def division(x, y): try: return x / y except ZeroDivisionError as e: print(e) return -1 finally: print(‘this will always execute’) print(division(10, 2)) print(division(10, 0)) # Output this will always execute 5.0 division by zero this will always execute -1
31 nonlocal nonlocal используется для доступа к переменным, определенным вне области действия блока. Это всегда используется во вложенных функциях для доступа к переменным, определенным снаружи def outer(): v = ‘outer’ def inner(): nonlocal v v = ‘inner’ inner() print(v) outer()
32 yield yield-это замена ключевого слова return. Это используется для возврата значений из функции одно за другим def multiplyByTen(*kwargs): for i in kwargs: yield i * 10 a = multiplyByTen(4, 5,) # a is generator object, an iterator # showing the values for i in a: print(i) # Output 40 50
33 break Оператор break используется с вложенными циклами” for “и” while». Он останавливает выполнение текущего цикла и передает управление в начало цикла number = 1 while True: print(number) number += 2 if number > 5: break print(number) # never executed # Output 1 3 5
34 for for используется для перебора элементов последовательности или итеративного объекта s1 = ‘Hello’ for c in s1: print(c) # Output H e l l o
35 not not используется для логической операции not x = 20 if x is not 10: print(‘x is not equal to 10’) x = True print(not x) # False

Вывод

Ключевые слова Python имеют определенные функции. Они используются интерпретатором для понимания кода и их выполнения. В Python 35 ключевых слов. Число будет продолжать расти с появлением новых функций.

Как получить список всех ключевых слов Python?

Python – получить список всех ключевых слов программно

Чтобы получить список всех ключевых слов Python программно, вы можете использовать KwList ключевое слово . библиотека.

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

KwList Возвращает последовательность, содержащую все ключевые слова, определенные для переводчика.

Пример 1: Получите все ключевые слова Python

В следующем примере мы получим все ключевые слова Python, используя свойство KWLIST и распечатайте их с помощью петли для цикла.

Это список всех ключевых слов в Python.

Резюме

В этом руководстве примеров Python мы узнали, как получить список всех программных ключевых слов Python.

Задача: извлечь ключевые выражения из текста на русском языке. NLP на Python

Сейчас, когда я пишу эту статью, сохранилась идея, но набор данных конечного результата сильно изменился:

  • выбираются не слова, а ключевые выражения и в том числе слова;
  • список ключевых выражений размечен 16-ю различными маркерами;
  • все слова текста (в том числе и не ключевые) лемматизированы – приведены в начальную форму или унифицированы под выведенный формат;
  • каждое слово в тексте имеет дополнительную аналитику, относящуюся к положению по тексту и числу повторений.
  • анализа текстов неограниченного круга тематик и отраслей (разработка и тестирование проводилось по материалам тематики промышленности и ВПК — Военно-Промышленного Комплекса);
  • автоматической рубрикации, классификации, каталогизации, предметизации материалов (online площадки);
  • контроля и фильтрации по содержимому с настройками реакции системы (службам и системам безопасности в замкнутых контурах или online);
  • многослойной разметки текстов (ИИ).

Качество

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

Качество выборки находится в интервале 95–100% при тестировании на статьях, размером не превышающих 3500 слов. Разброс связан с качеством и сложностью изложения. Вот пример одной из статей, участвовавших в тестировании, а вот результат её автоматического анализа.

Из полученного интервала качества необходимо убрать порядка 7-10%, т.е. фактический уровень качества, скорее будет 85-93%. Это связано с тем, что:

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

Что конкретно повлияло на качество результата в каждой статье, можно посмотреть в файле Reasons на GitHub.

Как читать результаты

В каждой папке для конкретной анализируемой статьи лежит 5 файлов с набором данных в юникоде:

  1. words.csv — список релевантных слов, включая список неидентифицированных;
  2. keys.csv — список ключевых слов, сейчас содержит, кроме маркированных выражений ещё и слова, которые повторяются по тексту не менее заданного числа раз – в данном случае не менее 4 раз;
  3. garbage.csv — список неидентифицированных слов;
  4. descr_words.csv — описание (статистика) к списку всех слов текста;
  5. descr_keys.csv — описание (статистика) к списку ключевых слов;

nrlpk позволяет получить любой набор данных в одном из следующих форматов:

  • Pandas Dataframe (по умолчанию);
  • Python Dictionary;
  • JSON;
  • CSV файл.

Методика тестирования

  1. Программный (автоматический) анализ текста.
  2. Ручное (глазками) выявление, ручное (маркирование) ключевых выражений и сверка полученного списка ключевых выражений, со списком, полученным автоматически.
  3. Расчет процента качества: число не попавших выражений или попавших в ключи некорректно + число слов в мусоре, к общему числу слов в тексте.

Инструменты

nrlpk написан на Python 3.7.0. Уже в процессе проработки будущего ПО nrlpk появились два обязательных требования:

  • выбираем выражения, а не слова – слова в том числе;
  • наличие словаря специализированных отраслевых терминов.

Для снятия сомнений была проведена ручная маркировка выборки текстов из СМИ, взятых с крупнейшего русскоязычного агрегатора новостей по тематике ВПК – ВПК.Name. Анализ маркировки выявил:

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

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

После анализа доступных для работы словарей русского языка за основу был взят OpenCorpora, к слову использующийся и в pymorphy2.
Он подвергся трансформации в форму удобную для работы с Pandas, после чего из него выделены следующие словари:

  • большой – вся база слов;
  • плохие слова – слова, исключаемые из анализа текста в связи с отсутствием значимости;
  • специальный – словарь специализированных (отраслевых) слов. В словарь не включены имена собственные: названия, имена, фамилии, адреса, продукция, изделия, компании, персоны и т.д. Это принципиальное и осознанное решение, поскольку в любой живой отрасли/направлении, такой подход потребовал бы постоянного контроля и ручного дополнения словарей, что губит идею облегчения труда через автоматизацию;

Поскольку основа для словарей в nrlpk и pymorphy2 идентична, то и обозначение частей речи (граммем) является идентичным. Число маркеров (нестандартных граммем) на данный момент составляет 16 и большинство из них, если маркированные выражения не состоят из нескольких слов, помимо маркера, имеют ещё и обозначение части речи базовой граммемы. Обозначение совпадающих маркеров (нестандартных граммем) с pymorphy2 идентично, в частности:

  • NUMB – число;
  • ROMN — римское число;
  • UNKN — токен не удалось разобрать.
  • NUSR – выражение содержит одно или несколько числовых данных;
  • MATH – выражение содержит математическую формулу.
  • если в тексте стоит 25 февраля 2020 года, то и ключевое выражение будет 25 февраля 2020 года, с леммой «25.02.2020», граммемой «NUSR» и маркером NUSR;
  • однако, если в тексте стоит «25 февраля 2020 года», то ключевое выражение будет «25 февраля 2020 года», с леммой «2ф2г», граммемой «WIQM» и маркером WIQM;
  • если в тексте будет 25 тонн, то и в ключе мы увидим «25 тонн», с леммой «2т», где в качестве в качестве граммемы и маркера также будет «NUSR».

Зачем понадобились describe к словам и ключам

Сначала это было нужно для проверки работы алгоритмов nrlpk – не потерялись ли слова, не прошло ли лишнего объединения, какова доля ключей в тексте и т.д.

Но по мере отладки ПО стали проявляться некоторые «закономерности», выявление которых, как задача, перед nrlpk не ставилась:

  • выявление слов, написанных с орфографическими ошибками;
  • выявление текстов с плохой стилистикой, bad-% > 35% (практические наблюдения в результате тестирования);
  • выявление целевых (узконаправленных, четко позиционирующих) текстов — skeys-% < 5 без числовых ключей (практические наблюдения в результате тестирования);
  • выявление текстов, не подпадающих под отраслевую тематику – skeys-% < 1.
  • выявление текстов «широкого охвата» — keys-% > 45% при ukeys-% стремящемуся к keys-%.

Для чего всё это написано

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

Метки к этому (начальному — на Хабре чуть изменен) тексту (приведены ниже) автоматически сгенерированы nrlpk со следующими параметрами:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *