Оригинальное название: НЛП на Python.
Перевод: Чен Чжиян
Вычитка: и китайский
Всего в этой статье2700Персонаж,Рекомендуемое чтение6 минут.
Обработка естественного языка — большая проблема в науке о данных. В этом посте мы представим библиотеку Python промышленного уровня.
Обработка естественного языка (NLP) — одна из самых интересных областей науки о данных, и все больше и больше специалистов по данным стремятся разрабатывать решения, связанные с неструктурированными текстовыми данными. Тем не менее, многим прикладным специалистам по данным (все с опытом работы в STEM и социальных науках) не хватает опыта NLP (обработка естественного языка).
В этом посте я рассмотрю некоторые основные концепции НЛП и покажу, как их реализовать с помощью набирающего популярность пакета Python spaCy. Эта статья подходит для начинающих НЛП, но предполагается, что читатель знаком с Python.
Вы про spaCy?
spaCy — это относительно новый пакет, «набор инструментов Python для работы с естественным языком промышленного уровня», разработанный Мэттом Хоннибалом из Explosion AI. Он разработан для специалистов по прикладным данным, что означает, что пользователям не нужно решать, какой алгоритм использовать для общих задач, и он невероятно быстр — невероятно быстр (это реализовано в Cython). Если вы знакомы со стеком науки о данных Python, spaCy — это пустяк НЛП, и он находится в самом низу, но он интуитивно понятен и довольно эффективен.
Итак, что он может сделать?
spaCy предоставляет универсальный набор задач, обычно используемых в любом проекте НЛП, в том числе:
-
Токенизация
-
Стемминг (лемматизация)
-
Маркировка частями речи
-
Распознавание объектов
-
Разбор зависимостей
-
Распознавание предложений
-
Преобразование слова в вектор
-
Множество удобных методов очистки и нормализации текста
Я дам общий обзор этих функций и объясню, как получить к ним доступ с помощью spaCy.
Итак, приступим.
Во-первых, мы загружаем конвейер spaCy, который по соглашению хранится в переменной с именем nlp. Объявление переменной занимает несколько секунд, потому что spaCy предварительно загружает модель и данные во внешний интерфейс для экономии времени. На самом деле, это может сделать часть тяжелой работы заранее, так что накладные расходы на синтаксический анализ данных не будут слишком высокими для nlp. Обратите внимание, что здесь мы используем языковую модель для английского языка, но есть и полнофункциональная немецкая модель, которую можно токенизировать на нескольких языках (обсуждается ниже).
Мы вызываем NLP в образце текста, чтобы создать объект Doc. Объект Doc — это контейнер задач НЛП самого текста, который делит текст на текст (объекты Span) и элементы (объекты Token), фактически не содержащие данных. Стоит отметить, что объекты Token и Span на самом деле не имеют данных. Вместо этого они содержат указатели на данные в объекте Doc и обрабатываются лениво (т. е. по запросу). Большая часть основных функций spaCy реализована с помощью методов объектов Doc (n = 33), Span (n = 29) и Token (n = 78).
In[1]:import spacy
...: nlp = spacy.load("en")
...: doc = nlp("The big grey dog ate all of the chocolate, but fortunately he wasn't sick!")
токенизация
Токенизация является фундаментальным шагом во многих задачах обработки естественного языка. Токенизация — это процесс разделения фрагмента текста на слова, символы, знаки препинания, пробелы и другие элементы для создания токена. Простой способ сделать это — разбить строку на пробелы:
In[2]:doc.text.split()
...: Out[2]: ['The', 'big', 'grey', 'dog', 'ate', 'all', 'of', 'the', 'chocolate,', 'but', 'fortunately', 'he', "wasn't", 'sick!']
На первый взгляд, эффект сегментации слов непосредственно пробелами неплох. Обратите внимание, однако, что он игнорирует пунктуацию и не отделяет глаголы от наречий («было», «не»). Другими словами, слишком наивно распознавать текстовые элементы, которые помогают нам (и машинам) понять его структуру и значение. Давайте посмотрим, как с этим справится spaCy:
In[3]:[token.orth_ for token in doc]
...:
Out[3]: ['The', 'big', 'grey', 'dog', 'ate', 'all', 'of', 'the', 'chocolate', ',', 'but', 'fortunately', 'he', 'was', "n't", ' ', 'sick', '!']
Здесь мы посещаем метод .orth_ каждого токена, который возвращает строку, представляющую токен, а не объект SpaCytoken. Это может быть не всегда желательно, но это стоит отметить. SpaCy может распознавать знаки препинания и отделять эти знаки препинания от токенов слов. Многие методы токенов SpaCy предоставляют как строковое, так и целочисленное возвращаемое значение для обрабатываемого текста: методы с суффиксом подчеркивания возвращают строку, а методы без суффикса подчеркивания возвращают целое число. Например:
In[4]:[(token, token.orth_, token.orth) for token in doc]
...:
Out[4]:[(The, 'The', 517), (big, 'big', 742), (grey, 'grey', 4623), (dog, 'dog', 1175), (ate, 'ate', 3469), (all, 'all', 516), (of, 'of', 471), (the, 'the', 466), (chocolate, 'chocolate', 3593), (,, ',', 416), (but, 'but', 494), (fortunately, 'fortunately', 15520), (he, 'he', 514), (was, 'was', 491), (n't, "n't", 479), ( , ' ', 483), (sick, 'sick', 1698), (!, '!', 495)]
In[5]: [token.orth_ for token in doc if not token.is_punct | token.is_space]
...:
Out[5]: ['The', 'big', 'grey', 'dog', 'ate', 'all', 'of', 'the', 'chocolate', 'but', 'fortunately', 'he', 'was', "n't", 'sick']
Круто, правда?
вытекание
Задача, связанная с сегментацией слов, — стемминг. Стемминг — это процесс приведения слова к его основной форме, материнскому слову. Слова разного употребления часто имеют один и тот же корень. Например, слова практика, практикуется и практикуется, по сути, означают одно и то же. Часто бывает необходимо привести слова сходного значения к их основной форме. Используя SpaCy, мы используем токенизированный метод .lemma_ для доступа к базовой форме каждого слова.
In[6]:practice = "practice practiced practicing"
...: nlp_practice = nlp(practice)
...: [word.lemma_ for word in nlp_practice]
...:
Out[6]: ['practice', 'practice', 'practice']
Почему это полезно? Непосредственным вариантом использования является машинное обучение, особенно классификация текста. Например, определение основы текста перед созданием «набора слов» позволяет избежать повторения слов, поэтому модель может более четко описывать шаблоны использования слов в нескольких документах.
тегирование части речи (POS) Маркировка)
Тегирование части речи — это процесс присвоения словам грамматических атрибутов (таких как существительные, глаголы, наречия, прилагательные и т. д.). Слова, имеющие одни и те же теги части речи, как правило, следуют схожим синтаксическим структурам, что полезно при обработке на основе правил.
Например, в заданном описании события мы можем захотеть определить, кому что принадлежит. Мы можем сделать это (предоставить грамматику текста), воспользовавшись притяжательным наклонением. SpaCy использует популярный POS-токен Penn Treebank (см. здесь). С помощью SpaCy можно получить доступ к POS-тегам общего и мелкого детализации с помощью методов .pos_ и .tag_ соответственно. Здесь я получаю доступ к детализированным POS-тегам:
In[7]:doc2 = nlp("Conor's dog's toy was hidden under the man's sofa in the woman's house")
...: pos_tags = [(i, i.tag_) fori indoc2]
...: pos_tags
...:
Out[7]:
[(Conor,'NNP'),
('s, 'POS'),
(dog,'NN'),
('s, 'POS'),
(toy,'NN'),
(was,'VBD'),
(hidden,'VBN'),
(under,'IN'),
(the,'DT'),
(man,'NN'),
('s, 'POS'),
(sofa,'NN'),
(in,'IN'),
(the,'DT'),
(woman,'NN'),
('s, 'POS'),
(house,'NN')]
Мы видим, что 's помечен POS. Мы можем использовать этот тег для извлечения владельца и того, что ему принадлежит:
In[8]:owners_possessions = []
...: for i in pos_tags: ...: if i[1] == "POS":
...: owner = i[0].nbor(-1)
...: possession = i[0].nbor(1)
...: owners_possessions.append((owner, possession))
...:
...: owners_possessions
...:
Out[8]: [(Conor, dog), (dog, toy), (man, sofa), (woman, house)]
Это вернет список кортежей, принадлежащих владельцу. Если вы хотите быть супер питоником в этом деле, вы можете записать его в виде полного списка (я думаю, что это лучше всего!):
In[9]: [(i[0].nbor(-1), i[0].nbor(+1)) for i in pos_tags if i[1] == "POS"]
...: Out[9]: [(Conor, dog), (dog, toy), (man, sofa), (woman, house)]
Здесь мы используем метод .nbor каждого токена, который возвращает токен, смежный с этим токеном.
признание сущности
Распознавание сущностей — это процесс классификации определенных сущностей в тексте по предопределенным категориям, таким как лица, места, организации, даты и т. д. spaCy использует статистические модели для классификации различных моделей, включая людей, события, произведения искусства и национальность/религию (полный список см. в документации)
Например, возьмем первые два предложения из статьи Барака Обамы в Википедии. Мы проанализируем этот текст, а затем воспользуемся методом .ents объекта Doc для доступа к идентифицированному объекту. Вызывая этот метод Doc, мы можем получить доступ к другим методам маркировки, в частности .label_ и .label:
In[10]:wiki_obama = """Barack Obama is an American politician who served as
...: the 44th President of the United States from 2009 to 2017.He is the first
...: African American to have served as president,
...: as well as the first born outside the contiguous United States."""
…:
...:nlp_obama = НЛП(wiki_obama)
…: [(i, i.label_, i.label) для i в nlp_obama.ents]
...:
Out[10]: [(Barack Obama, 'PERSON', 346), (American, 'NORP', 347), (the United States, 'GPE', 350), (2009 to 2017, 'DATE', 356), (first, 'ORDINAL', 361), (African, 'NORP', 347), (American, 'NORP', 347), (first, 'ORDINAL', 361), (United States, 'GPE', 350)]
Вы можете увидеть, какие сущности распознаются моделью в этом примере и насколько они точны. PERSON не требует пояснений; NORP означает национальность или религиозную группу; GGPE определяет местонахождение (город, страну и т. д.); DATE указывает конкретную дату или диапазон дат, а ORDINAL определяет слово или число, представляющее определенный тип порядка.
Пока мы говорим о методе Doc, стоит упомянуть идентификаторы предложений spaCy. Нередко задача НЛП хочет разбить документ на предложения. Использовать SpaCy для доступа к методу Doc's.sents несложно:
In[11]:for ix, sent in enumerate(nlp_obama.sents, 1):
...: print("Sentence number {}: {}".format(ix, sent))
...: Sentence number 1: Barack Obama is an American politician who served as the 44th President of the United States from 2009 to 2017.Sentence number 2: He is the first African American to have served as president, as well as the first born outside the contiguous United States.
Это все на данный момент. В будущих статьях я покажу, как использовать spaCy в сложных задачах интеллектуального анализа данных и машинного обучения.
TrueSight — это платформа AIOps, основанная на машинном обучении и аналитике, которая решает проблемы, связанные с несколькими облаками, и увеличивает скорость цифровой трансформации, тем самым повышая эффективность ИТ-операций.
Оригинальная ссылка: https://dzone.com/articles/nlp-in-python
Профиль переводчика
Чен Янжи, окончил Пекинский университет Цзяотун по специальности инженер связи и управления и получил степень магистра инженерных наук.Он работал инженером в компании Great Wall Computer Software and Systems, инженером в компании Datang Microelectronics, а в настоящее время является технической поддержкой Пекина. Уи Чаокунь Технолоджи Ко., Лтд. В настоящее время занимается эксплуатацией и обслуживанием интеллектуальной системы обучения переводу, он накопил определенный опыт в области глубокого обучения искусственного интеллекта и обработки естественного языка (NLP). В свободное время он любит переводить и творить.Его переводческие работы в основном включают: IEC-ISO 7816, Иракский нефтяной инженерный проект, Декларация нового фискализма и т. д. Среди них китайско-английская работа «Декларация нового фискализма». в ГЛОБАЛЬНОМ TIMES официально выпущен. Я могу использовать свое свободное время, чтобы присоединиться к группе добровольцев-переводчиков платформы THU Data School.Я надеюсь общаться и делиться с вами и вместе добиваться прогресса.
Информация о наборе команды переводчиков
Содержание работы:Чтобы перевести избранные иностранные статьи на беглый китайский язык, требуется осторожность. Если вы иностранный студент, изучающий науку о данных/статистику/компьютер, или занимаетесь соответствующей работой за границей, или уверены в своем уровне иностранного языка, вы можете присоединиться к команде переводчиков.
Вы можете получить:Регулярные тренинги по переводу повышают уровень перевода добровольцев и улучшают их осведомленность о границах науки о данных.Зарубежные друзья могут поддерживать связь с разработкой отечественных технологических приложений.Производственный, образовательный и исследовательский опыт THU Data School дает хорошие возможности для развития волонтеры.
Другие преимущества:Вашими партнерами в команде переводчиков станут специалисты по обработке данных из известных компаний, студенты Пекинского университета, Университета Цинхуа и известных зарубежных университетов.
Нажмите «Прочитать исходный текст» в конце статьи, чтобы присоединиться к команде данных~
нажмите«Прочитай исходный текст»Примите организацию