Python для НЛП: работа с библиотекой Gensim (часть 1)

Это 10-я статья из моей серии статей о Python для НЛП. В моей предыдущей статье [/ python-for-nlp-getting-started-with-the-stanfordcorenlp-library /] я объяснил, как библиотека StanfordCoreNLP [https://stanfordnlp.github.io/CoreNLP/index.html] может использоваться для выполнения различных задач НЛП. В этой статье мы исследуем библиотеку Gensim [https://radimrehurek.com/gensim/intro.html], которая является еще одной чрезвычайно полезной библиотекой NLP для Python. Gensim в первую очередь разрабатывался для темы

Это 10-я статья из моей серии статей о Python для НЛП. В своей предыдущей статье я объяснил, как можно использовать библиотеку StanfordCoreNLP для выполнения различных задач НЛП.

В этой статье мы исследуем библиотеку Gensim , еще одну чрезвычайно полезную библиотеку НЛП для Python. Gensim в первую очередь разрабатывался для тематического моделирования. Однако теперь он поддерживает множество других задач НЛП, таких как преобразование слов в векторы (word2vec), документ в векторы (doc2vec), поиск сходства текста и резюмирование текста.

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

Установка Gensim

Если вы используете установщик pip для установки библиотек Python, вы можете использовать следующую команду для загрузки библиотеки Gensim:

 $ pip install gensim 

В качестве альтернативы, если вы используете дистрибутив Python для Anaconda, вы можете выполнить следующую команду для установки библиотеки Gensim:

 $ conda install -c anaconda gensim 

Давайте теперь посмотрим, как мы можем выполнять различные задачи НЛП с помощью библиотеки Gensim.

Создание словарей

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

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

Создание словарей с использованием объектов в памяти

С помощью библиотеки Python Gensim очень легко создавать словари, которые сопоставляют слова с идентификаторами. Взгляните на следующий сценарий:

 import gensim 
 from gensim import corpora 
 from pprint import pprint 
 
 text = ["""In computer science, artificial intelligence (AI), 
 sometimes called machine intelligence, is intelligence 
 demonstrated by machines, in contrast to the natural intelligence 
 displayed by humans and animals. Computer science defines 
 AI research as the study of intelligent agents: any device that 
 perceives its environment and takes actions that maximize its chance 
 of successfully achieving its goals."""] 
 
 tokens = [[token for token in sentence.split()] for sentence in text] 
 gensim_dictionary = corpora.Dictionary(tokens) 
 
 print("The dictionary has: " +str(len(gensim_dictionary)) + " tokens") 
 
 for k, v in gensim_dictionary.token2id.items(): 
 print(f'{k:{15}} {v:{10}}') 

В приведенном выше сценарии мы сначала импортируем gensim вместе с corpora из библиотеки. Затем у нас есть текст (это первая часть первого абзаца статьи Википедии об искусственном интеллекте), хранящийся в text переменной.

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

 tokens = [[token for token in sentence.split()] for sentence in text] 

Теперь мы готовы создать наш словарь. Для этого мы можем использовать объект Dictionary corpora и передать ему список токенов.

Наконец, чтобы распечатать содержимое только что созданного словаря, мы можем использовать объект token2id класса Dictionary Результат выполнения сценария выше выглядит следующим образом:

 The dictionary has: 46 tokens 
 (AI), 0 
 AI 1 
 Computer 2 
 In 3 
 achieving 4 
 actions 5 
 agents: 6 
 and 7 
 animals. 8 
 any 9 
 artificial 10 
 as 11 
 by 12 
 called 13 
 chance 14 
 computer 15 
 contrast 16 
 defines 17 
 demonstrated 18 
 device 19 
 displayed 20 
 environment 21 
 goals. 22 
 humans 23 
 in 24 
 intelligence 25 
 intelligence, 26 
 intelligent 27 
 is 28 
 its 29 
 machine 30 
 machines, 31 
 maximize 32 
 natural 33 
 of 34 
 perceives 35 
 research 36 
 science 37 
 science, 38 
 sometimes 39 
 study 40 
 successfully 41 
 takes 42 
 that 43 
 the 44 
 to 45 

Вывод показывает каждое уникальное слово в нашем тексте вместе с числовым идентификатором, который был присвоен этому слову. Слово или токен - это ключ словаря, а идентификатор - это значение. Вы также можете увидеть идентификатор, присвоенный отдельному слову, используя следующий скрипт:

 print(gensim_dictionary.token2id["study"]) 

В приведенном выше сценарии мы передаем слово «учеба» как ключ к нашему словарю. В выходных данных вы должны увидеть соответствующее значение, то есть идентификатор слова «исследование», равный 40.

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

 print(list(gensim_dictionary.token2id.keys())[list(gensim_dictionary.token2id.values()).index(40)]) 

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

 print(gensim_dictionary.token2id) 

Результат выглядит следующим образом:

 {'(AI),': 0, 'AI': 1, 'Computer': 2, 'In': 3, 'achieving': 4, 'actions': 5, 'agents:': 6, 'and': 7, 'animals.': 8, 'any': 9, 'artificial': 10, 'as': 11, 'by': 12, 'called': 13, 'chance': 14, 'computer': 15, 'contrast': 16, 'defines': 17, 'demonstrated': 18, 'device': 19, 'displayed': 20, 'environment': 21, 'goals.': 22, 'humans': 23, 'in': 24, 'intelligence': 25, 'intelligence,': 26, 'intelligent': 27, 'is': 28, 'its': 29, 'machine': 30, 'machines,': 31, 'maximize': 32, 'natural': 33, 'of': 34, 'perceives': 35, 'research': 36, 'science': 37, 'science,': 38, 'sometimes': 39, 'study': 40, 'successfully': 41, 'takes': 42, 'that': 43, 'the': 44, 'to': 45} 

Результат может быть не таким четким, как тот, который напечатан с использованием цикла, хотя он все еще служит своей цели.

Давайте теперь посмотрим, как мы можем добавить дополнительные токены в существующий словарь, используя новый документ. Взгляните на следующий сценарий:

 text = ["""Colloquially, the term "artificial intelligence" is used to 
 describe machines that mimic "cognitive" functions that humans 
 associate with other human minds, such as "learning" and "problem solving"""] 
 
 tokens = [[token for token in sentence.split()] for sentence in text] 
 gensim_dictionary.add_documents(tokens) 
 
 print("The dictionary has: " + str(len(gensim_dictionary)) + " tokens") 
 print(gensim_dictionary.token2id) 

В приведенном выше сценарии у нас есть новый документ, который содержит вторую часть первого абзаца статьи Википедии об искусственном интеллекте. Мы разбиваем текст на токены, а затем просто вызываем add_documents чтобы добавить токены в наш существующий словарь. Наконец, мы печатаем обновленный словарь на консоли.

Вывод кода выглядит так:

 The dictionary has: 65 tokens 
 {'(AI),': 0, 'AI': 1, 'Computer': 2, 'In': 3, 'achieving': 4, 'actions': 5, 'agents:': 6, 'and': 7, 'animals.': 8, 'any': 9, 'artificial': 10, 'as': 11, 'by': 12, 'called': 13, 'chance': 14, 'computer': 15, 'contrast': 16, 'defines': 17, 'demonstrated': 18, 'device': 19, 'displayed': 20, 'environment': 21, 'goals.': 22, 'humans': 23, 'in': 24, 'intelligence': 25, 'intelligence,': 26, 'intelligent': 27, 'is': 28, 'its': 29, 'machine': 30, 'machines,': 31, 'maximize': 32, 'natural': 33, 'of': 34, 'perceives': 35, 'research': 36, 'science': 37, 'science,': 38, 'sometimes': 39, 'study': 40, 'successfully': 41, 'takes': 42, 'that': 43, 'the': 44, 'to': 45, '"artificial': 46, '"cognitive"': 47, '"learning"': 48, '"problem': 49, 'Colloquially,': 50, 'associate': 51, 'describe': 52, 'functions': 53, 'human': 54, 'intelligence"': 55, 'machines': 56, 'mimic': 57, 'minds,': 58, 'other': 59, 'solving': 60, 'such': 61, 'term': 62, 'used': 63, 'with': 64} 

Вы можете видеть, что теперь у нас в словаре 65 токенов, тогда как раньше у нас было 45 токенов.

Создание словарей с использованием текстовых файлов

В предыдущем разделе у нас был текст в памяти. Что, если мы хотим создать словарь, прочитав текстовый файл с жесткого диска? Для этого мы можем использовать метод simple_process из библиотеки gensim.utils Преимущество использования этого метода заключается в том, что он считывает текстовый файл построчно и возвращает токены в строке. Вам не нужно загружать полный текстовый файл в память, чтобы создать словарь.

Перед выполнением следующего примера создайте файл «file1.txt» и добавьте в него следующий текст (это первая половина первого абзаца статьи Википедии о глобальном потеплении).

 Global warming is a long-term rise in the average temperature of the Earth's climate system, an aspect of climate change shown by temperature measurements and by multiple effects of the warming. Though earlier geological periods also experienced episodes of warming, the term commonly refers to the observed and continuing increase in average air and ocean temperatures since 1900 caused mainly by emissions of greenhouse gasses in the modern industrial economy. 

Теперь создадим словарь, который будет содержать токены из текстового файла file1.txt:

 from gensim.utils import simple_preprocess 
 from smart_open import smart_open 
 import os 
 
 gensim_dictionary = corpora.Dictionary(simple_preprocess(sentence, deacc=True) for sentence in open(r'E:\\text files\\file1.txt', encoding='utf-8')) 
 
 print(gensim_dictionary.token2id) 

В приведенном выше сценарии мы считываем текстовый файл "file1.txt" построчно, используя метод simple_preprocess Метод возвращает токены в каждой строке документа. Затем токены используются для создания словаря. В выводе вы должны увидеть токены и соответствующие им идентификаторы, как показано ниже:

 {'average': 0, 'climate': 1, 'earth': 2, 'global': 3, 'in': 4, 'is': 5, 'long': 6, 'of': 7, 'rise': 8, 'system': 9, 'temperature': 10, 'term': 11, 'the': 12, 'warming': 13, 'an': 14, 'and': 15, 'aspect': 16, 'by': 17, 'change': 18, 'effects': 19, 'measurements': 20, 'multiple': 21, 'shown': 22, 'also': 23, 'earlier': 24, 'episodes': 25, 'experienced': 26, 'geological': 27, 'periods': 28, 'though': 29, 'air': 30, 'commonly': 31, 'continuing': 32, 'increase': 33, 'observed': 34, 'ocean': 35, 'refers': 36, 'temperatures': 37, 'to': 38, 'caused': 39, 'economy': 40, 'emissions': 41, 'gasses': 42, 'greenhouse': 43, 'industrial': 44, 'mainly': 45, 'modern': 46, 'since': 47} 

Точно так же мы можем создать словарь, прочитав несколько текстовых файлов. Создайте еще один файл «file2.txt» и добавьте в него следующий текст (вторая часть первого абзаца статьи Википедии о глобальном потеплении):

 In the modern context the terms global warming and climate change are commonly used interchangeably, but climate change includes both global warming and its effects, such as changes to precipitation and impacts that differ by region.[7][8] Many of the observed warming changes since the 1950s are unprecedented in the instrumental temperature record, and in historical and paleoclimate proxy records of climate change over thousands to millions of years. 

Сохраните файл «file2.txt» в том же каталоге, что и «file1.txt».

Следующий сценарий читает оба файла, а затем создает словарь на основе текста в двух файлах:

 from gensim.utils import simple_preprocess 
 from smart_open import smart_open 
 import os 
 
 class ReturnTokens(object): 
 def __init__(self, dir_path): 
 self.dir_path = dir_path 
 
 def __iter__(self): 
 for file_name in os.listdir(self.dir_path): 
 for sentence in open(os.path.join(self.dir_path, file_name), encoding='utf-8'): 
 yield simple_preprocess(sentence) 
 
 path_to_text_directory = r"E:\text files" 
 gensim_dictionary = corpora.Dictionary(ReturnTokens(path_to_text_directory)) 
 
 print(gensim_dictionary.token2id) 

В приведенном выше сценарии у нас есть метод ReturnTokens , который принимает путь к каталогу, который содержит «file1.txt» и «file2.txt» в качестве единственного параметра. Внутри метода мы перебираем все файлы в каталоге, а затем читаем каждый файл построчно. Метод simple_preprocess создает токены для каждой строки. Токены для каждой строки возвращаются вызывающей функции с помощью ключевого слова yield .

На выходе вы должны увидеть следующие токены вместе с их идентификаторами:

 {'average': 0, 'climate': 1, 'earth': 2, 'global': 3, 'in': 4, 'is': 5, 'long': 6, 'of': 7, 'rise': 8, 'system': 9, 'temperature': 10, 'term': 11, 'the': 12, 'warming': 13, 'an': 14, 'and': 15, 'aspect': 16, 'by': 17, 'change': 18, 'effects': 19, 'measurements': 20, 'multiple': 21, 'shown': 22, 'also': 23, 'earlier': 24, 'episodes': 25, 'experienced': 26, 'geological': 27, 'periods': 28, 'though': 29, 'air': 30, 'commonly': 31, 'continuing': 32, 'increase': 33, 'observed': 34, 'ocean': 35, 'refers': 36, 'temperatures': 37, 'to': 38, 'caused': 39, 'economy': 40, 'emissions': 41, 'gasses': 42, 'greenhouse': 43, 'industrial': 44, 'mainly': 45, 'modern': 46, 'since': 47, 'are': 48, 'context': 49, 'interchangeably': 50, 'terms': 51, 'used': 52, 'as': 53, 'both': 54, 'but': 55, 'changes': 56, 'includes': 57, 'its': 58, 'precipitation': 59, 'such': 60, 'differ': 61, 'impacts': 62, 'instrumental': 63, 'many': 64, 'record': 65, 'region': 66, 'that': 67, 'unprecedented': 68, 'historical': 69, 'millions': 70, 'over': 71, 'paleoclimate': 72, 'proxy': 73, 'records': 74, 'thousands': 75, 'years': 76} 

Создание корпуса пакета слов

Словари содержат сопоставления между словами и соответствующими им числовыми значениями. Набор корпусов слов в библиотеке Gensim основан на словарях и содержит идентификатор каждого слова вместе с частотой появления слова.

Создание пакета слов из объектов в памяти

Взгляните на следующий сценарий:

 import gensim 
 from gensim import corpora 
 from pprint import pprint 
 
 text = ["""In computer science, artificial intelligence (AI), 
 sometimes called machine intelligence, is intelligence 
 demonstrated by machines, in contrast to the natural intelligence 
 displayed by humans and animals. Computer science defines 
 AI research as the study of intelligent agents: any device that 
 perceives its environment and takes actions that maximize its chance 
 of successfully achieving its goals."""] 
 
 tokens = [[token for token in sentence.split()] for sentence in text] 
 
 gensim_dictionary = corpora.Dictionary() 
 gensim_corpus = [gensim_dictionary.doc2bow(token, allow_update=True) for token in tokens] 
 
 print(gensim_corpus) 

В приведенном выше скрипте у нас есть текст, который мы разбиваем на токены. Затем мы инициализируем объект Dictionary из модуля corpora Объект содержит метод doc2bow , который в основном выполняет две задачи:

  • Он перебирает все слова в тексте, если слово уже существует в корпусе, увеличивает счетчик частоты для слова.
  • В противном случае он вставляет слово в корпус и устанавливает его частоту равной 1.

Результат вышеупомянутого скрипта выглядит так:

 [[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 2), (8, 1), (9, 1), (10, 1), (11, 1), (12, 2), (13, 1), (14, 1), (15, 1), (16, 1), (17, 1), (18, 1), (19, 1), (20, 1), (21, 1), (22, 1), (23, 1), (24, 1), (25, 3), (26, 1), (27, 1), (28, 1), (29, 3), (30, 1), (31, 1), (32, 1), (33, 1), (34, 2), (35, 1), (36, 1), (37, 1), (38, 1), (39, 1), (40, 1), (41, 1), (42, 1), (43, 2), (44, 2), (45, 1)]] 

Вывод может не иметь для вас смысла. Позвольте мне это объяснить. Первый кортеж (0,1) в основном означает, что слово с идентификатором 0 встречается в тексте 1 раз. Точно так же (25, 3) означает, что слово с ID 25 встречается в документе три раза.

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

 word_frequencies = [[(gensim_dictionary[id], frequence) for id, frequence in couple] for couple in gensim_corpus] 
 print(word_frequencies) 

Результат выглядит так:

 [[('(AI),', 1), ('AI', 1), ('Computer', 1), ('In', 1), ('achieving', 1), ('actions', 1), ('agents:', 1), ('and', 2), ('animals.', 1), ('any', 1), ('artificial', 1), ('as', 1), ('by', 2), ('called', 1), ('chance', 1), ('computer', 1), ('contrast', 1), ('defines', 1), ('demonstrated', 1), ('device', 1), ('displayed', 1), ('environment', 1), ('goals.', 1), ('humans', 1), ('in', 1), ('intelligence', 3), ('intelligence,', 1), ('intelligent', 1), ('is', 1), ('its', 3), ('machine', 1), ('machines,', 1), ('maximize', 1), ('natural', 1), ('of', 2), ('perceives', 1), ('research', 1), ('science', 1), ('science,', 1), ('sometimes', 1), ('study', 1), ('successfully', 1), ('takes', 1), ('that', 2), ('the', 2), ('to', 1)]] 

Из выходных данных видно, что слово «интеллект» встречается три раза. Точно так же слово «тот» встречается дважды.

Создание пакета слов из текстовых файлов

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

 from gensim.utils import simple_preprocess 
 from smart_open import smart_open 
 import os 
 
 tokens = [simple_preprocess(sentence, deacc=True) for sentence in open(r'E:\text files\file1.txt', encoding='utf-8')] 
 
 gensim_dictionary = corpora.Dictionary() 
 gensim_corpus = [gensim_dictionary.doc2bow(token, allow_update=True) for token in tokens] 
 word_frequencies = [[(gensim_dictionary[id], frequence) for id, frequence in couple] for couple in gensim_corpus] 
 
 print(word_frequencies) 

В приведенном выше скрипте мы создали пакет слов, используя "file1.txt". На выходе вы должны увидеть слова из первого абзаца статьи о глобальном потеплении в Википедии.

 [[('average', 1), ('climate', 1), ('earth', 1), ('global', 1), ('in', 1), ('is', 1), ('long', 1), ('of', 1), ('rise', 1), ('system', 1), ('temperature', 1), ('term', 1), ('the', 2), ('warming', 1)], [('climate', 1), ('of', 2), ('temperature', 1), ('the', 1), ('warming', 1), ('an', 1), ('and', 1), ('aspect', 1), ('by', 2), ('change', 1), ('effects', 1), ('measurements', 1), ('multiple', 1), ('shown', 1)], [('of', 1), ('warming', 1), ('also', 1), ('earlier', 1), ('episodes', 1), ('experienced', 1), ('geological', 1), ('periods', 1), ('though', 1)], [('average', 1), ('in', 1), ('term', 1), ('the', 2), ('and', 2), ('air', 1), ('commonly', 1), ('continuing', 1), ('increase', 1), ('observed', 1), ('ocean', 1), ('refers', 1), ('temperatures', 1), ('to', 1)], [('in', 1), ('of', 1), ('the', 1), ('by', 1), ('caused', 1), ('economy', 1), ('emissions', 1), ('gasses', 1), ('greenhouse', 1), ('industrial', 1), ('mainly', 1), ('modern', 1), ('since', 1)]] 

Выходные данные показывают, что такие слова, как «of», «the», «by» и «and» встречаются дважды.

Точно так же вы можете создать пакет слов, используя несколько текстовых файлов, как показано ниже:

 from gensim.utils import simple_preprocess 
 from smart_open import smart_open 
 import os 
 
 class ReturnTokens(object): 
 def __init__(self, dir_path): 
 self.dir_path = dir_path 
 
 def __iter__(self): 
 for file_name in os.listdir(self.dir_path): 
 for sentence in open(os.path.join(self.dir_path, file_name), encoding='utf-8'): 
 yield simple_preprocess(sentence) 
 
 path_to_text_directory = r"E:\text files" 
 
 gensim_dictionary = corpora.Dictionary() 
 gensim_corpus = [gensim_dictionary.doc2bow(token, allow_update=True) for token in ReturnTokens(path_to_text_directory)] 
 word_frequencies = [[(gensim_dictionary[id], frequence) for id, frequence in couple] for couple in gensim_corpus] 
 
 print(word_frequencies) 

Результат выполнения сценария выше выглядит следующим образом:

 [[('average', 1), ('climate', 1), ('earth', 1), ('global', 1), ('in', 1), ('is', 1), ('long', 1), ('of', 1), ('rise', 1), ('system', 1), ('temperature', 1), ('term', 1), ('the', 2), ('warming', 1)], [('climate', 1), ('of', 2), ('temperature', 1), ('the', 1), ('warming', 1), ('an', 1), ('and', 1), ('aspect', 1), ('by', 2), ('change', 1), ('effects', 1), ('measurements', 1), ('multiple', 1), ('shown', 1)], [('of', 1), ('warming', 1), ('also', 1), ('earlier', 1), ('episodes', 1), ('experienced', 1), ('geological', 1), ('periods', 1), ('though', 1)], [('average', 1), ('in', 1), ('term', 1), ('the', 2), ('and', 2), ('air', 1), ('commonly', 1), ('continuing', 1), ('increase', 1), ('observed', 1), ('ocean', 1), ('refers', 1), ('temperatures', 1), ('to', 1)], [('in', 1), ('of', 1), ('the', 1), ('by', 1), ('caused', 1), ('economy', 1), ('emissions', 1), ('gasses', 1), ('greenhouse', 1), ('industrial', 1), ('mainly', 1), ('modern', 1), ('since', 1)], [('climate', 1), ('global', 1), ('in', 1), ('the', 2), ('warming', 1), ('and', 1), ('change', 1), ('commonly', 1), ('modern', 1), ('are', 1), ('context', 1), ('interchangeably', 1), ('terms', 1), ('used', 1)], [('climate', 1), ('global', 1), ('warming', 1), ('and', 2), ('change', 1), ('effects', 1), ('to', 1), ('as', 1), ('both', 1), ('but', 1), ('changes', 1), ('includes', 1), ('its', 1), ('precipitation', 1), ('such', 1)], [('in', 1), ('of', 1), ('temperature', 1), ('the', 3), ('warming', 1), ('by', 1), ('observed', 1), ('since', 1), ('are', 1), ('changes', 1), ('differ', 1), ('impacts', 1), ('instrumental', 1), ('many', 1), ('record', 1), ('region', 1), ('that', 1), ('unprecedented', 1)], [('climate', 1), ('in', 1), ('of', 2), ('and', 2), ('change', 1), ('to', 1), ('historical', 1), ('millions', 1), ('over', 1), ('paleoclimate', 1), ('proxy', 1), ('records', 1), ('thousands', 1), ('years', 1)]] 

Создание корпуса TF-IDF

Подход с использованием набора слов отлично подходит для преобразования текста в числа. Однако у него есть один недостаток. Он присваивает оценку слову на основе его появления в конкретном документе. При этом не учитывается тот факт, что это слово может также часто встречаться в других документах. TF-IDF решает эту проблему.

Частота термина рассчитывается как:

 Term frequency = (Frequency of the word in a document)/(Total words in the document) 

А частота обратного документа рассчитывается как:

 IDF(word) = Log((Total number of documents)/(Number of documents containing the word)) 

Используя библиотеку Gensim, мы можем легко создать корпус TF-IDF:

 import gensim 
 from gensim import corpora 
 from pprint import pprint 
 
 text = ["I like to play Football", 
 "Football is the best game", 
 "Which game do you like to play ?"] 
 
 tokens = [[token for token in sentence.split()] for sentence in text] 
 
 gensim_dictionary = corpora.Dictionary() 
 gensim_corpus = [gensim_dictionary.doc2bow(token, allow_update=True) for token in tokens] 
 
 from gensim import models 
 import numpy as np 
 
 tfidf = models.TfidfModel(gensim_corpus, smartirs='ntc') 
 
 for sent in tfidf[gensim_corpus]: 
 print([[gensim_dictionary[id], np.around(frequency, decimals=2)] for id, frequency in sent]) 

Для того, чтобы найти значение TF-IDF, мы можем использовать TfidfModel класс из models модуля библиотеки Gensim. Нам просто нужно передать мешок корпуса слов в качестве параметра конструктору класса TfidfModel На выходе вы увидите все слова в трех предложениях вместе с их значениями TF-IDF:

 [['Football', 0.3], ['I', 0.8], ['like', 0.3], ['play', 0.3], ['to', 0.3]] 
 [['Football', 0.2], ['best', 0.55], ['game', 0.2], ['is', 0.55], ['the', 0.55]] 
 [['like', 0.17], ['play', 0.17], ['to', 0.17], ['game', 0.17], ['?', 0.47], ['Which', 0.47], ['do', 0.47], ['you', 0.47]] 

Загрузка встроенных моделей и наборов данных Gensim

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

Чтобы загрузить встроенную модель или набор данных, мы можем использовать класс downloader из библиотеки gensim Затем мы можем вызвать метод нагрузки на downloader классе для загрузки нужного пакета. Посмотрите на следующий код:

 import gensim.downloader as api 
 
 w2v_embedding = api.load("glove-wiki-gigaword-100") 

С помощью приведенных выше команд мы загружаем модель встраивания слов "glove-wiki-gigaword-100", которая в основном основана на тексте Википедии и является 100-мерной. Попробуем найти слова, похожие на «toyota», используя нашу модель встраивания слов. Для этого используйте следующий код:

 w2v_embedding.most_similar('toyota') 

На выходе вы должны увидеть следующие результаты:

 [('honda', 0.8739858865737915), 
 ('nissan', 0.8108116984367371), 
 ('automaker', 0.7918163537979126), 
 ('mazda', 0.7687169313430786), 
 ('bmw', 0.7616022825241089), 
 ('ford', 0.7547588348388672), 
 ('motors', 0.7539199590682983), 
 ('volkswagen', 0.7176680564880371), 
 ('prius', 0.7156582474708557), 
 ('chrysler', 0.7085398435592651)] 

Как видите, все результаты очень актуальны для слова «toyota». Число в дроби соответствует показателю сходства. Более высокий индекс сходства означает, что слово более актуально.

Заключение

Библиотека Gensim - одна из самых популярных библиотек Python для НЛП. В этой статье мы кратко рассмотрели, как библиотеку Gensim можно использовать для выполнения таких задач, как создание словаря и корпуса. Мы также увидели, как загружать встроенные модули Gensim. В нашей следующей статье мы увидим, как выполнять моделирование тем с помощью библиотеки Gensim.

comments powered by Disqus

Содержание