Python - подходы к лемматизации с примерами
Ниже приводится пошаговое руководство по изучению различных подходов к лемматизации в Python, а также несколько примеров и реализации кода. Настоятельно рекомендуется придерживаться данного потока, если у вас нет понимания темы, и в этом случае вы можете найти любой из подходов, приведенных ниже. 
Что такое лемматизация?
В отличие от стемминга, лемматизация намного мощнее. Он выходит за рамки сокращения слов и рассматривает весь словарный запас языка для применения морфологического анализа к словам, стремясь удалить только флективные окончания и вернуть базовую или словарную форму слова, известную как лемма .
Для ясности взгляните на следующие примеры, приведенные ниже:
Оригинальное слово ---> Корневой Word (лемма) Характеристика встреча ---> встреча (извлечение основного слова) было ---> быть (преобразование времени в настоящее время) мыши ---> мышь (от множественного числа до единственного числа)
TIP: Always convert your text to lowercase before performing any NLP task including lemmatizing.
Различные подходы к лемматизации:
Мы рассмотрим 9 различных подходов к выполнению лемматизации, а также несколько примеров и реализаций кода.
- WordNet
- WordNet (с тегом POS)
- TextBlob
- TextBlob (с тегом POS)
- СПАСИБО
- TreeTagger
- Шаблон
- Gensim
- Стэнфордский CoreNLP
1. Лемматизатор Wordnet
Wordnet - это общедоступная лексическая база данных более чем 200 языков, которая обеспечивает семантические отношения между своими словами. Это одна из самых ранних и наиболее часто используемых техник лемматизирования.
- Он присутствует в библиотеке nltk в Python.
- Wordnet связывает слова в смысловые отношения. (например, синонимы)
- Он группирует синонимы в виде синсетов .
- synsets : группа элементов данных, которые семантически эквивалентны.
Как использовать:
- Загрузите пакет nltk : в командной строке или в терминале anaconda введите:
pip install nltk - Загрузите Wordnet с сайта nltk : в консоли pyhton выполните следующие действия:
import nltk
nltk.download('wordnet')
nltk.download('averaged_perceptron_tagger')
Код:
import nltknltk.download( 'wordnet' )from nltk.stem import WordNetLemmatizer # Create WordNetLemmatizer objectwnl = WordNetLemmatizer() # single word lemmatization exampleslist1 = [ 'kites' , 'babies' , 'dogs' , 'flying' , 'smiling' , 'driving' , 'died' , 'tried' , 'feet' ]for words in list1: print (words + " ---> " + wnl.lemmatize(words)) #> kites ---> kite#> babies ---> baby#> dogs ---> dog#> flying ---> flying#> smiling ---> smiling#> driving ---> driving#> died ---> died#> tried ---> tried#> feet ---> foot |
Код:
# sentence lemmatization examplesstring = 'the cat is sitting with the bats on the striped mat under many flying geese' # Converting String into tokenslist2 = nltk.word_tokenize(string)print (list2)#> ['the', 'cat', 'is', 'sitting', 'with', 'the', 'bats', 'on',# 'the', 'striped', 'mat', 'under', 'many', 'flying', 'geese'] lemmatized_string = ' ' .join([wnl.lemmatize(words) for words in list2]) print (lemmatized_string)#> the cat is sitting with the bat on the striped mat under many flying goose |
2. Лемматизатор Wordnet (с тегом POS)
В описанном выше подходе мы заметили, что результаты Wordnet не были на должном уровне. Такие слова, как «сидеть», «летать» и т. Д., Остались прежними после лемматизации. Это потому, что в данном предложении эти слова рассматриваются как существительные, а не как глаголы. Чтобы решить эту проблему, мы используем теги POS (часть речи).
Мы добавляем тег с определенным словом, определяющим его тип (глагол, существительное, прилагательное и т. Д.).
Например,
Слово + Тип (тег POS) -> Лемматизированное слово
вождение + глагол 'v' -> драйв
собаки + существительное -> собака
Код:
3. TextBlob
TextBlob - это библиотека Python, используемая для обработки текстовых данных. Он предоставляет простой API для доступа к своим методам и выполнения основных задач НЛП.
Загрузите пакет TextBlob: в командной строке или в терминале anaconda введите:
pip install textblob
Код:
from textblob import TextBlob, Word my_word = 'cats' # create a Word objectw = Word(my_word) print (w.lemmatize())#> cat sentence = 'the bats saw the cats with stripes hanging upside down by their feet.' s = TextBlob(sentence)lemmatized_sentence = " " .join([w.lemmatize() for w in s.words]) print (lemmatized_sentence)#> the bat saw the cat with stripe hanging upside down by their foot |
4. TextBlob (с тегом POS)
То же, что и в подходе Wordnet без использования соответствующих тегов POS, мы наблюдаем те же ограничения и в этом подходе. Итак, мы используем один из наиболее мощных аспектов модуля TextBlob - теги «Часть речи», чтобы решить эту проблему.
Код:
from textblob import TextBlob # Define function to lemmatize each word with its POS tag # POS_TAGGER_FUNCTION : TYPE 2def pos_tagger(sentence): sent = TextBlob(sentence) tag_dict = { "J" : 'a' , "N" : 'n' , "V" : 'v' , "R" : 'r' } words_tags = [(w, tag_dict.get(pos[ 0 ], 'n' )) for w, pos in sent.tags] lemma_list = [wd.lemmatize(tag) for wd, tag in words_tags] return lemma_list # Lemmatizesentence = "the bats saw the cats with stripes hanging upside down by their feet"lemma_list = pos_tagger(sentence)lemmatized_sentence = " " .join(lemma_list)print (lemmatized_sentence)#> the bat saw the cat with stripe hang upside down by their foot lemmatized_sentence = " " .join([w.lemmatize() for w in t_blob.words])print (lemmatized_sentence)#> the bat saw the cat with stripe hanging upside down by their foot |
Here is a link for all the types of tag abbreviations with their meanings. (scroll down for the tags table)
5. СПАСИБО
spaCy - это библиотека Python с открытым исходным кодом, которая анализирует и «понимает» большие объемы текста. Доступны отдельные модели для определенных языков (английский, французский, немецкий и т. Д.).
Загрузите пакет spaCy : (a) Откройте приглашение или терминал anaconda от имени администратора и выполните команду:
pip install -U spacy
(b) Теперь откройте программу или терминал anaconda в обычном режиме и выполните команду:
python -m spacy download en
В случае успеха вы должны увидеть такое сообщение:
Связывание выполнено успешно
C: Anaconda3 envs spacyenv lib site-packages en_core_web_sm ->
C: Anaconda3 envs spacyenv lib site-packages spacy data en
Теперь вы можете загрузить модель через nlp = spacy.load('en_core_web_sm')Код:
import spacynlp = spacy.load( 'en_core_web_sm' ) # Create a Doc objectdoc = nlp(u 'the bats saw the cats with best stripes hanging upside down by their feet' ) # Create list of tokens from given stringtokens = []for token in doc: tokens.append(token) print (tokens)#> [the, bats, saw, the, cats, with, best, stripes, hanging, upside, down, by, their, feet] lemmatized_sentence = " " .join([token.lemma_ for token in doc]) print (lemmatized_sentence)#> the bat see the cat with good stripe hang upside down by -PRON- foot |
В приведенном выше коде мы заметили, что этот подход был более мощным, чем наши предыдущие подходы, так как:
- Были обнаружены даже Про-существительные. (обозначено -PRON- )
- Даже самое лучшее было заменено на хорошее.
6. TreeTagger
TreeTagger - это инструмент для аннотирования текста с помощью части речи и информации леммы. TreeTagger был успешно использован для тегирования более 25 языков и может быть адаптирован к другим языкам, если доступен корпус обучения с тегами вручную. Слово POS Лемма в DT в TreeTagger НП TreeTagger является ВБЗ быть легкий JJ легкий к К к использовать VB использовать . ПОСЛАЛ .
Как использовать:
1. Загрузите пакет TreeTagger : в командной строке или в терминале anaconda введите:
pip install treetaggerwrapper
2. Загрузите программное обеспечение TreeTagger: нажмите TreeTagger и загрузите программное обеспечение в соответствии с вашей ОС.
(Шаги по установке указаны на сайте)
Код:
# 6. TREETAGGER LEMMATIZERimport pandas as pdimport treetaggerwrapper as tt t_tagger = tt.TreeTagger(TAGLANG = 'en' , TAGDIR = 'C:WindowsTreeTagger' ) pos_tags = t_tagger.tag_text( "the bats saw the cats with best stripes hanging upside down by their feet" ) original = []lemmas = []tags = []for t in pos_tags: original.append(t.split( ' ' )[ 0 ]) tags.append(t.split( ' ' )[ 1 ]) lemmas.append(t.split( ' ' )[ - 1 ]) Results = pd.DataFrame({ 'Original' : original, 'Lemma' : lemmas, 'Tags' : tags})print (Results) #> Original Lemma Tags# 0 the the DT# 1 bats bat NNS# 2 saw see VVD# 3 the the DT# 4 cats cat NNS# 5 with with IN# 6 best good JJS# 7 stripes stripe NNS# 8 hanging hang VVG# 9 upside upside RB# 10 down down RB# 11 by by IN# 12 their their PP$# 13 feet foot NNS |
7. Выкройка
Pattern - это пакет Python, обычно используемый для веб-майнинга, обработки естественного языка, машинного обучения и сетевого анализа. У него много полезных возможностей НЛП. Он также содержит особую функцию, о которой мы поговорим ниже.
Как использовать:
Загрузить пакет шаблонов: в командной строке или в терминале anaconda введите:
pip install patternКод:
# PATTERN LEMMATIZERpattern importfrom pattern.en import lemma, lexemefrom pattern.en import parse sentence = "the bats saw the cats with best stripes hanging upside down by their feet" lemmatized_sentence = " " .join([lemma(word) for word in sentence.split()]) print (lemmatized_sentence)#> the bat see the cat with best stripe hang upside down by their feet # Special Feature : to get all possible lemmas for each word in the sentenceall_lemmas_for_each_word = [lexeme(wd) for wd in sentence.split()]print (all_lemmas_for_each_word) #> [['the', 'thes', 'thing', 'thed'],# ['bat', 'bats', 'batting', 'batted'],# ['see', 'sees', 'seeing', 'saw', 'seen'],# ['the', 'thes', 'thing', 'thed'],# ['cat', 'cats', 'catting', 'catted'],# ['with', 'withs', 'withing', 'withed'],# ['best', 'bests', 'besting', 'bested'],# ['stripe', 'stripes', 'striping', 'striped'],# ['hang', 'hangs', 'hanging', 'hung'],# ['upside', 'upsides', 'upsiding', 'upsided'],# ['down', 'downs', 'downing', 'downed'],# ['by', 'bies', 'bying', 'bied'],# ['their', 'theirs', 'theiring', 'theired'],# ['feet', 'feets', 'feeting', 'feeted']] |
NOTE : if the above code raises an error saying ‘generator raised StopIteration’. Just run it again. It will work after 3-4 tries.
8. Генсим
Gensim разработан для обработки больших текстовых коллекций с использованием потоковой передачи данных. Его средства лемматизации основаны на пакете шаблонов, который мы установили выше.
- Для выполнения лемматизации можно использовать функцию gensim.utils.lemmatize (). Этот метод входит в состав модуля utils в Python.
- Мы можем использовать этот лемматизатор из шаблона для извлечения токенов в кодировке UTF8 в их базовой форме = лемме.
- По умолчанию учитываются только существительные , глаголы , прилагательные и наречия (все остальные леммы отбрасываются).
- Например
Слово ---> Лемматизированное слово есть / есть / быть ---> b e пила ---> см.
Как использовать:
1. Загрузите пакет Pattern : в командной строке или в терминале anaconda введите:
pip install pattern
2. Загрузите пакет Gensim: откройте командную строку или терминал anaconda от имени администратора и введите:
pip install -U gensim
ИЛИ
pip3 install -U gensim (if using python3)Код:
from gensim.utils import lemmatize sentence = "the bats saw the cats with best stripes hanging upside down by their feet" lemmatized_sentence = [word.decode( 'utf-8' ).split( '.' )[ 0 ] for word in lemmatize(sentence)] print (lemmatized_sentence)#> ['bat / NN', 'see / VB', 'cat / NN', 'best / JJ',# 'stripe / NN', 'hang / VB', 'upside / RB', 'foot / NN'] |
NOTE : if the above code raises an error saying ‘generator raised StopIteration‘. Just run it again. It will work after 3-4 tries.
В приведенном выше коде, как вы, возможно, уже заметили, лемматизатор gensim игнорирует такие слова, как 'the' , 'with' , 'by', поскольку они не попадают в 4 категории лемм, упомянутых выше. (существительное / глагол / прилагательное / наречие)
9. Стэнфордский CoreNLP
CoreNLP позволяет пользователям выводить лингвистические аннотации для текста, включая границы маркеров и предложений, части речи, именованные сущности, числовые и временные значения, анализ зависимостей и групп, тональность, атрибуцию цитат и отношения.
- CoreNLP - это универсальный инструмент для обработки естественного языка в Java!
- CoreNLP в настоящее время поддерживает 6 языков, включая арабский, китайский, английский, французский, немецкий и испанский.
Как использовать:
1. Получите JAVA 8: загрузите Java 8 (в соответствии с вашей ОС) и установите ее.
2. Получите пакет Stanford_coreNLP:
2.1) Скачать Stanford_CoreNLP и разархивируйте его.
2.2) Открытый терминал
(а) перейдите в каталог, в который вы извлекли указанный выше файл, выполнив
cd C: Users ... stanford-corenlp-4.1.0 на терминале
(б) затем запустите сервер Stanford CoreNLP, выполнив на терминале следующую команду:
java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -annotators "tokenize, ssplit, pos, lemma, parse, sentiment" -port 9000 -timeout 30000
** (оставьте свой терминал открытым, пока вы используете этот лемматизатор) **
3. Загрузите пакет Standford CoreNLP: откройте командную строку или терминал anaconda, введите:
pip install stanfordcorenlpКод:
from stanfordcorenlp import StanfordCoreNLPimport json # Connect to the CoreNLP server we just started # Define proporties needed to get lemmaprops = { 'annotators' : 'pos, lemma' , 'pipelineLanguage' : 'en' , 'outputFormat' : 'json' } sentence = "the bats saw the cats with best stripes hanging upside down by their feet"parsed_str = nlp.annotate(sentence, properties = props)print (parsed_str) #> "sentences": [{"index": 0,# "tokens": [# {# "index": 1,# "word": "the",# "originalText": "the",# "lemma": "the", <--------------- LEMMA# "characterOffsetBegin": 0,# "characterOffsetEnd": 3,# "pos": "DT",# "before": "",# "after": " "# },# {# "index": 2,# "word": "bats",# "originalText": "bats",# "lemma": "bat", <--------------- LEMMA# "characterOffsetBegin": 4,# "characterOffsetEnd": 8,# "pos": "NNS",# "before": " ",# "after": " "# },# {# "index": 3,# "word": "saw",# "originalText": "saw",# "lemma": "see", <--------------- LEMMA# "characterOffsetBegin": 9,# "characterOffsetEnd": 12,# "pos": "VBD",# "before": " ",# "after": " "# },# {# "index": 4,# "word": "the",# "originalText": "the",# "lemma": "the", <--------------- LEMMA# "characterOffsetBegin": 13,# "characterOffsetEnd": 16,# "pos": "DT",# "before": " ",# "after": " "# },# {# "index": 5,# "word": "cats",# "originalText": "cats",# "lemma": "cat", <--------------- LEMMA# "characterOffsetBegin": 17,# "characterOffsetEnd": 21,# "pos": "NNS",# "before": " ",# "after": " "# },# {# "index": 6,# "word": "with",# "originalText": "with",# "lemma": "with", <--------------- LEMMA# "characterOffsetBegin": 22,# "characterOffsetEnd": 26,# "pos": "IN",# "before": " ",# "after": " "# },# {# "index": 7,# "word": "best",# "originalText": "best",# "lemma": "best", <--------------- LEMMA# "characterOffsetBegin": 27,# "characterOffsetEnd": 31,# "pos": "JJS",# "before": " ",# "after": " "# },# {# "index": 8,# "word": "stripes",# "originalText": "stripes",# "lemma": "stripe", <--------------- LEMMA# "characterOffsetBegin": 32,# "characterOffsetEnd": 39,# "pos": "NNS",# "before": " ",# "after": " "# },# {# "index": 9,# "word": "hanging",# "originalText": "hanging",# "lemma": "hang", <--------------- LEMMA# "characterOffsetBegin": 40,# "characterOffsetEnd": 47,# "pos": "VBG",# "before": " ",# "after": " "# },# {# "index": 10,# "word": "upside",# "originalText": "upside",# "lemma": "upside", <--------------- LEMMA# "characterOffsetBegin": 48,# "characterOffsetEnd": 54,# "pos": "RB",# "before": " ",# "after": " "# },# {# "index": 11,# "word": "down",# "originalText": "down",# "lemma": "down", <--------------- LEMMA# "characterOffsetBegin": 55,# "characterOffsetEnd": 59,# "pos": "RB",# "before": " ",# "after": " "# },# {# "index": 12,# "word": "by",# "originalText": "by",# "lemma": "by", <--------------- LEMMA# "characterOffsetBegin": 60,# "characterOffsetEnd": 62,# "pos": "IN",# "before": " ",# "after": " "# },# {# "index": 13,# "word": "their",# "originalText": "their",# "lemma": "they"#, <--------------- LEMMA# "characterOffsetBegin": 63,# "characterOffsetEnd": 68,# "pos": "PRP$",# "before": " ",# "after": " "# },# {# "index": 14,# "word": "feet",# "originalText": "feet",# "lemma": "foot", <--------------- LEMMA# "characterOffsetBegin": 69,# "characterOffsetEnd": 73,# "pos": "NNS",# "before": " ",# "after": ""# }# ]# }# ] |
Код:
# To get the lemmatized sentece as output # ** RUN THE ABOVE SCRIPT FIRST ** lemma_list = []for item in parsed_dict[ 'sentences' ][ 0 ][ 'tokens' ]: for key, value in item.items(): if key = = 'lemma' : lemma_list.append(value) print (lemma_list)#> ['the', 'bat', 'see', 'the', 'cat', 'with', 'best', 'stripe', 'hang', 'upside', 'down', 'by', 'they', 'foot'] lemmatized_sentence = " " .join(lemma_list)print (lemmatized_sentence)#>the bat see the cat with best stripe hang upside down by the foot |
Заключение:
Итак, это различные подходы к лемматизации, на которые вы можете ссылаться, работая над проектом НЛП