Введение в 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_))
Однако, использованная модель русского языка не поддерживает этого.