Изменения

Перейти к: навигация, поиск

Обработка естественного языка

8429 байт добавлено, 20:41, 7 февраля 2021
Векторизация
* для глаголов, причастий, деепричастий {{---}} глагол в инфинитиве несовершенного вида.
=== [[Векторное представление слов|Векторизация]] ==={{main|Векторное представление слов}}
Большинство математических моделей работают в векторных пространствах больших размерностей, поэтому необходимо отобразить текст в векторном пространстве. Основным походом является мешок слов (bag-of-words): для документа формируется вектор размерности словаря, для каждого слова выделяется своя размерность, для документа записывается признак насколько часто слово встречается в нем, получаем вектор. Наиболее распространенным методом для вычисления признака является TF-IDF<ref>[https://ru.wikipedia.org/wiki/TF-IDF TF-IDF]</ref> (TF {{---}} частота слова, term frequency, IDF {{---}} обратная частота документа, inverse document frequency). TF вычисляется, например, счетчиком вхождения слова. IDF обычно вычисляют как логарифм от числа документов в корпусе, разделённый на количество документов, где это слово представлено. Таким образом, если какое-то слово встретилось во всех документах корпуса, то такое слово не будет никуда добавлено. Плюсами мешка слов является простая реализация, однако данный метод теряет часть информации, например, порядок слов.
Для уменьшения потери информации можно использовать мешок N-грамм (добавлять не только слова, но и словосочетания), или использовать методы векторных представлений слов это, например, позволяет снизить ошибку на словах с одинаковыми написаниями, но разными значениями.
Использование N-грамм применяется в задаче выявления плагиата. Текст разбивается на несколько фрагментов, представленных N-граммами. Сравнение N-грамм друг с другом позволяет определить степень сходства документов. Аналогичным способом можно решать задачу исправления орфографических ошибок, подбирая слова кандидаты для замены.
 
=== Частеречная разметка ===
Частеречная разметка (POS-тэгирование, англ. part-of-speech tagging) используется в NLP для определения части речи и грамматических характеристик слов в тексте с приписыванием им соответствующих тегов. Модель необходима, когда значение слова зависит от контекста. Например, в предложениях "Столовая ложка" и "Школьная столовая" слово "столовая" имеет разные части речи. POS-тэгирование позволяет сопоставить слову в тексте специальный тэг на основе его значения и контекста.
 
Алгоритмы частеречной разметки делятся на несколько групп:
* ''Стохастический метод''. Такой метод имеет два похожих друг на друга подхода. Первый подход основывается на частоте встречаемости слова с конкретным тэгом: если определенное слово встречается чаще всего с тэгом "существительное", то скорее всего и сейчас оно будет иметь такой тэг. Второй вариант использует n-граммы {{---}} анализируя входную последовательность, алгоритм высчитывает вероятность, что в данном контексте будет определенный тэг. В конце просчета вероятностей выбирается тэг, который имеет наибольшую вероятность. Библиотека TextBlob<ref>[https://textblob.readthedocs.io/en/dev/ TextBlob]</ref> в своей основе использует стохастический метод.
* ''Основанные на правилах''. Метод основан на заранее известных правилах. Алгоритм состоит из двух стадий. Сначала расставляются потенциальные тэги всем словам на основе словаря или по какому-либо другому принципу. Далее, если у какого-нибудь слова оказалось несколько тэгов, правильный тэг выбирается на основе рукописных правил. Правил должно быть много, чтобы решить все возникшие неопределенности и учесть все случаи. Например, правило: слова длиной меньше трех символов являются частицами, местоимениями или предлогами. Однако такое правило не учитывает некоторые короткие слова из других частей речи. В библиотеке NLTK<ref>[https://www.nltk.org/ NLTK]</ref> используется данный метод.
* ''С использованием [[Скрытые Марковские модели|скрытой марковской модели]]''. Пусть в нашей Марковской модели ''тэги'' будут '''скрытыми состояниями''', которые производят '''наблюдаемое событие''' {{---}} ''слова''. С математической точки зрения, мы хотим найти такую ''последовательность тэгов (C)'', которая будет максимизировать условную вероятность <tex>P(C|W)</tex>, где <tex>C = C_1, C_2, \dots C_T</tex> и <tex>W = W_1, W_2, \dots W_T</tex>. Воспользовавшись формулой Байеса получим, что максимизировать необходимо следующее выражение: <tex>p(C_1, C_2, \dots C_T) \cdot p(W_1, W_2, \dots W_T | C_1, C_2, \dots C_T)</tex>. Библиотека spaCy<ref>[https://spacy.io/ spaCy]</ref> основана на скрытой марковской модели.
 
POS-тэгирование является неотъемлемой частью обработки естественного языка. Без частеречной разметки становится невозможным дальнейший анализ текста из-за возникновения неопределенностей в значениях слов. Данный алгоритм используется при решении таких задач как перевод на другой язык, определение смысла текста, проверка на пунктуационные и речевые ошибки. Также можно автоматизировать процесс определения хештегов у постов и статей, выделяя существительные в приведенном тексте.
 
Благодаря частому использованию POS-тэгирования на практике, существует много встроенных библиотек с готовыми реализациями. Например, NLTK, scikit-learn<ref>[https://scikit-learn.org scikit-learn]</ref>, spaCy, TextBlob, HunPOS<ref>[https://code.google.com/archive/p/hunpos/ HunPOS]</ref>, Standford POS Tagger<ref>[https://nlp.stanford.edu/software/tagger.shtml Stanford]</ref> и другие. Примеры использования некоторых библиотек:
* TextBlob (''стохастический метод''):
from textblob import TextBlob
text = ("The quick brown fox jumps over the lazy dog")
blob_object = TextBlob(text)
print(blob_object.tags)
'''output:''' [('The', 'DT'), ('quick', 'JJ'), ('brown', 'JJ'), ('fox', 'NN'), ('jumps', 'VBZ'), ('over', 'IN'), ('the', 'DT'), ('lazy', 'JJ'), ('dog', 'NN')]
* NLTK (''основанный на правилах''):
import nltk
from nltk.tokenize import word_tokenize
text = word_tokenize("Hello welcome to the world of to learn Categorizing and POS Tagging with NLTK and Python")
nltk.pos_tag(text)
'''output:''' [('Hello', 'NNP'), ('welcome', 'NN'), ('to', 'TO'), ('the', 'DT'), ('world', 'NN'), ('of', 'IN'), ('to', 'TO'), ('learn', 'VB'), ('Categorizing', 'NNP'), ('and', 'CC'), ('POS', 'NNP'), ('Tagging', 'NNP'), ('with', 'IN'), ('NLTK', 'NNP'), ('and', 'CC'), ('Python', 'NNP')]
* spaCy (''с использованием скрытой марковской модели''):
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("The quick brown fox jumps over the lazy dog")
for token in doc:
print((token.text, token.pos_))
'''output:''' [('The', 'DT'), ('quick', 'JJ'), ('brown', 'JJ'), ('fox', 'NN'), ('jumps', 'NNS'), ('over', 'IN'), ('the', 'DT'), ('lazy', 'JJ'), ('dog', 'NN')]
* HunPOS:
from os.path import expanduser
home = expanduser("~")
from nltk.tag.hunpos import HunposTagger
_path_to_bin = home + '/hunpos-1.0-linux/hunpos-tag'
_path_to_model = home + '/hunpos-1.0-linux/en_wsj.model'
ht = HunposTagger(path_to_model=_path_to_model, path_to_bin=_path_to_bin)
text = "The quick brown fox jumps over the lazy dog"
ht.tag(text.split())
'''output:''' [('The', 'DT'), ('quick', 'JJ'), ('brown', 'JJ'), ('fox', 'NN'), ('jumps', 'NNS'), ('over', 'IN'), ('the', 'DT'), ('lazy', 'JJ'), ('dog', 'NN')]
* Stanford POS tagger
from os.path import expanduser
home = expanduser("~")
from nltk.tag.stanford import POSTagger
_path_to_model = home + '/stanford-postagger/models/english-bidirectional-distsim.tagger'
_path_to_jar = home + '/stanford-postagger/stanford-postagger.jar'
st = POSTagger(path_to_model=_path_to_model, path_to_jar=_path_to_jar)
text = "The quick brown fox jumps over the lazy dog"
st.tag(text.split())
'''output:''' [('The', 'DT'), ('quick', 'JJ'), ('brown', 'JJ'), ('fox', 'NN'), ('jumps', 'VBZ'), ('over', 'IN'), ('the', 'DT'), ('lazy', 'JJ'), ('dog', 'NN')]
== Библиотеки для NLP ==
174
правки

Навигация