Введение в NLP (Python)

NLP - обработка текста на естественном языке.

Все методы NLP начинаются с набора тестовых данных (корпус). Корпус - это неотформатированный текст, который состоит из символов. Также как и при построении анализаторов языков программирования, текст делится на лексемы (токены) для упрощения обработки

1. Токенизация текста

 

Это разбиение текста на лексемы (токены). К сожалению, стандартной модели русского языка в spacy нет, поэтому воспользуемся этим https://github.com/buriy/spacy-ru Инсталляция исходя из предположения, что вы используете Google Colab

!pip install pymorphy2==0.8

!git clone -b v2.1 https://github.com/buriy/spacy-ru.git 

!cp -r ./spacy-ru/ru2/. /content/ru2

 

Код для выделения лексем:

 

import spacy

nlp = spacy.load('ru2'#, disable=['tagger', 'parser', 'NER'])

nlp.add_pipe(nlp.create_pipe('sentencizer'), first=True)

text = "Приветвыпить нет?" 

tokens = [str(token) for token in nlp(text.lower())]

 

print(tokens)

 

Результат:

['привет', ',', 'выпить', 'нет', '?']

 

2. N-граммы

 

Это последовательности фиксированной длины N, следующих друг за другом лексем. Генерация N-грам является удобным механизмом работы.

 

def Ngramms(tokens,size):

  '''

  Принимает на вход лексемы и возвращает список n-грамм

  '''

  return [tokens[i:i+size] for i in range(len(tokens)-size+1)]

 

 

print(Ngramms(tokens,2))

 

Результат:

[['привет', ','], [',', 'выпить'], ['выпить', 'нет'], ['нет', '?']]

 

3. Основы слов (леммы)

 

Слова, особенного русского языка, можно склонять во все стороны, поэтому важным является выделение основы слова. Ниже приведён пример свёртки слов до корневых форм.

 

s = nlp("Однажды, в студёную зимнюю пору")

for token in s:    

 

  print('{} --> {}'.format(token, token.lemma_))

 

Результат:

Однажды --> однажды , --> , в --> в студёную --> студёный зимнюю --> зимний пору --> пора

 

4. Категоризация и разбивка на порции

В категоризации (прилагательное глагол, и др.) нет ничего сложного. Это использование такого цикла:

for chunk in s.noun_chunks:    
   print ('{} - {}'.format(chunk, chunk.label_))

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