В последнее время слово «добыча полезных ископаемых» можно услышать на каждом углу. Причина заключается не только в ажиотаже биткойнов, но и в волне интереса к инструментам машинного обучения и инструментам для анализа поведения клиентов. Текстовый майнинг - один из таких инструментов. В серии следующих статей я поделюсь с вами самыми мощными методами интеллектуального анализа текста и определю некоторые из наиболее часто используемых инструментов обработки языка. Также я постараюсь прояснить наиболее частые проблемы с обработкой текста.

Что такое «интеллектуальный анализ текста»?

Вы когда-нибудь публиковали отзыв о новом телефоне, который вы купили, или комментировали видеоигру, которую вы пробовали? Все данные, которые вы и другие клиенты оставляете в Интернете, тщательно собираются компаниями и владельцами продуктов. Это называется «свежие текстовые данные» или «неструктурированные данные». Много усилий и денег вкладывается в анализ этих неструктурированных данных с максимально возможной точностью, поскольку это ключ к пониманию поведения клиентов. Именно здесь на сцену выходит интеллектуальный анализ текста.

Методы интеллектуального анализа текста (например, анализ тональности или извлечение понятий) извлекают значимую информацию из повседневного письма. Текст часто содержит сленг, сарказм, непоследовательный синтаксис, грамматические ошибки, двусмысленность и т. Д. Это создает проблему для машинных алгоритмов, поскольку все методы интеллектуального анализа текста требуют правильно структурированных текстовых предложений или документов. Итак, если вы все же хотите реализовать алгоритм, кто-то должен исправить все ошибки письма и стандартизировать словоформы, чтобы сделать их более сопоставимыми. Лучше всего это сделать с помощью инструментов обработки естественного языка.

Инструменты обработки естественного языка (NLP) помогают компьютерам успешно обрабатывать большие массивы естественного языка. В некотором роде они учат компьютеры читать. Между НЛП и интеллектуальным анализом текста есть тонкая грань, и большинство людей считает их синонимами, но есть разница. В то время как интеллектуальный анализ текста обнаруживает релевантную информацию в тексте, преобразовывая ее в данные, обработка естественного языка преобразует текст с использованием лингвистического анализа. Его конечная цель - выполнить обработку языка, подобного человеческому.

Интеллектуальный анализ текста и NLP обычно используются вместе, потому что можно получить лучший результат, если текст каким-то образом предварительно обработан и структурирован. Для Python есть отличная реализация NLP: nltk package. Вы можете использовать другие пакеты или даже лучше - реализовать собственный алгоритм! Далее по тексту я объясню некоторые из наиболее полезных инструментов морфологии и синтаксиса и дам вам примеры того, как использовать ntlk.

Определение границ предложения (или токенизация предложения) - находит разрывы в заданном тексте. Вы можете спросить, зачем это нужно, когда предложения обычно разделяются знаками препинания (например, «.», «!» Или «?»), Но проблема возникает, когда пунктуация используется для обозначения сокращений или составных слов (например, «быстро- мышление »или« спешка »).

Пример токенизации предложения с помощью nltk:

from nltk import sent_tokenize 
sentence = "Prof. Balthazar is a nice scientist who always solves the problems of his fellow-citizens by means of a magic machine."
print(sent_tokenize(sentence))

Вывод:

['Prof. Balthazar is a nice scientist who always solves the problems of his fellow-citizens by means of a magic machine.']

В этом предложении «Проф.» будет рассматриваться как самостоятельное предложение, если разделить текст точкой. Чтобы избежать этой проблемы, вы можете использовать nltk.sent_tokenize (), который классифицирует весь пример как одно предложение. Эта функция доступна на 17 европейских языках, но, к сожалению, не на хорватском (и что делать в случае хорватского языка или другого недоступного языка, я расскажу в своей следующей статье).

Сегментация слов (или токенизация слов) - разделение продолжения текста на независимые слова. В большинстве западных языков (например, английском, хорватском или французском) слова разделены пробелом. Но для таких языков, как китайский или японский, где слова не разделены, это может стать серьезной проблемой!

Вот пример токенизации слов с помощью nltk: «Он решает проблемы с помощью своих изобретений и своей машины harly-burlytron, которая капает идеи». С помощью nltk вы можете получить список всех слов в предложении, включая сложные двойные слова.

from nltk import word_tokenize 
text = "He solves problems with his inventions and his hurly-burlytron machine that drips ideas."
print(word_tokenize(text))

Вывод:

['He', 'solves', 'problems', 'with', 'his', 'inventions', 'and', 'his', 'hurly-burlytron', 'machine', 'that', 'drips', 'ideas', '.']

Теги части речи (POS) (или грамматические теги) используются для определения класса каждого слова, т. е. для идентификации слова как существительного, глагола, прилагательного или наречия и т. д. Многие слова можно использовать как несколько частей речи, например «снаружи» в приведенном ниже примере. Кроме того, языки различаются различием классов слов, а те, которые менее флективны (например, английский), имеют большую двусмысленность. Есть даже некоторые полинезийские языки, в которых отсутствует различие между существительными и глаголами.

Пример: в зависимости от контекста слово «снаружи» может быть существительным, прилагательным или наречием.

Тот же пример, обработанный с помощью nltk:

import nltk 
text = word_tokenize("The outside of magic machine looks spectacular.") 
nltk.pos_tag(text)
text2 = word_tokenize("Flying Fabijan is rarely outside of his tram.") 
nltk.pos_tag(text2)
text3 = word_tokenize("All the Balthazartown is waiting for him outside.") 
nltk.pos_tag(text3)

Вывод:

[('The', 'DT'), ('outside', 'NN'), ('of', 'IN'), ('magic', 'JJ'), ('machine', 'NN'), ('looks', 'VBZ'), ('spectacular', 'JJ'), ('.', '.')]
[('Flying', 'VBG'), ('Fabijan', 'NNP'), ('is', 'VBZ'), ('rarely', 'RB'), ('outside', 'JJ'), ('of', 'IN'), ('his', 'PRP$'), ('tram', 'NN'), ('.', '.')]
[('All', 'PDT'), ('the', 'DT'), ('Balthazartown', 'NNP'), ('is', 'VBZ'), ('waiting', 'VBG'), ('for', 'IN'), ('him', 'PRP'), ('outside', 'RB'), ('.', '.')]

Stemming - это процесс сокращения изменяемых слов до их основы, то есть корня. Он не обязательно должен быть морфологическим; вы можете просто отрубить у слов концы. Например, слово «решить» является основой слов «решить» и «решено».

Наиболее часто используемые алгоритмы - это алгоритм Портера (только английский), его усовершенствованный Snowball (поддерживает другие языки, такие как арабский, испанский и немецкий) и Lancaster’s (очень агрессивный стеммер английского языка).

Создатель Мартин Портер назвал свой алгоритм Snowball в честь SNOBOL, превосходного языка обработки строк, созданного господами Фарбером, Гризвольдом, Поажем и Полонски из 1960-х годов, но первоначально он хотел назвать его «стрипперграммой», потому что в нем есть суффикс « СТРИПЕР ГРАММАТИКА.

Пример использования самых популярных стеммеров с nltk для слова «соглашение». Как видите, алгоритм Ланкастера самый агрессивный:

from nltk.stem.porter import PorterStemmer 
from nltk.stem.lancaster import LancasterStemmer 
from nltk.stem import SnowballStemmer
porter = PorterStemmer() 
lancaster = LancasterStemmer() 
snowball = SnowballStemmer("english")
print(porter.stem("agreement")) 
print(lancaster.stem("agreement")) 
print(snowball.stem("agreement"))

Вывод:

agreement
agr
agreement

В моей компании Kraken мы создали собственный стеммер для хорватского языка на основе его грамматических правил, но некоторые из них доступны онлайн. В контексте анализа настроений (в нашем случае это были комментарии Facebook) этот шаг имел решающее значение для преобразования слов в более похожие формы. При создании стеммера вы должны быть осторожны, чтобы не переборщить или недооценить слово, так как вы можете отрезать все буквы, кроме первой, или оставить слишком много и иметь несколько форм одного и того же слова (см. Пример ниже ).

Пример чрезмерного и недостаточного выделения корней с помощью алгоритма Портера для слов «организация» и «поглощение». Превышение корня сокращает слова с разным значением в одном корне, в то время как нижнее выделение оставляет слова то же значение разные:

# Over-stemming 
print(porter.stem("organization")) 
print(porter.stem("organs"))
# Under-stemming 
print(porter.stem("absorption")) 
print(porter.stem("absorbing"))

Вывод:

organ 
organ
absorpt 
absorb

Лемматизация - аналогично стеммингу, лемматизация сокращает слова до их лемм (словарной формы), но делает это с использованием словарного и морфологического анализа. Это намного сложнее и требует много времени, так как нужно проверять контекст слов. Таким образом, в большинстве случаев достаточно использовать стемминг, но при необходимости (например, в случаях создания текстового словаря) nltk предоставляет лемматизатор WordNet на основе большого словаря английских слов WordNet.

Пример различия между лемматизатором WordNet и стеммером Snowball; видно, что лемматизатор использует словарь:

from nltk.stem import WordNetLemmatizer 
wnl = WordNetLemmatizer() 
print(wnl.lemmatize("libraries")) 
print(snowball.stem("libraries"))

Вывод:

library
librari

Извлечение терминологии - извлекает ключевой термин из данного предложения или текста. Важным шагом в подобном случае является тегирование POS, потому что слова получают разную оценку важности в зависимости от их части речи. Для английского языка существует несколько отличных реализаций Python, таких как пакеты rake-nltk (RAKE или алгоритм быстрого автоматического извлечения ключевых слов) и kea (KEA или алгоритм извлечения ключевых слов).

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

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

Первоначально опубликовано на krakensystems.co.