In [1]:
import sys
In [2]:
!{sys.executable} -m pip install pymorphy2
Collecting pymorphy2
  Downloading https://files.pythonhosted.org/packages/a3/33/fff9675c68b5f6c63ec8c6e6ff57827dda28a1fa5b2c2d727dffff92dd47/pymorphy2-0.8-py2.py3-none-any.whl (46kB)
Collecting dawg-python>=0.7 (from pymorphy2)
  Downloading https://files.pythonhosted.org/packages/6a/84/ff1ce2071d4c650ec85745766c0047ccc3b5036f1d03559fd46bb38b5eeb/DAWG_Python-0.7.2-py2.py3-none-any.whl
Collecting pymorphy2-dicts<3.0,>=2.4 (from pymorphy2)
  Downloading https://files.pythonhosted.org/packages/02/51/2465fd4f72328ab50877b54777764d928da8cb15b74e2680fc1bd8cb3173/pymorphy2_dicts-2.4.393442.3710985-py2.py3-none-any.whl (7.1MB)
Collecting docopt>=0.6 (from pymorphy2)
  Downloading https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz
Building wheels for collected packages: docopt
  Running setup.py bdist_wheel for docopt: started
  Running setup.py bdist_wheel for docopt: finished with status 'done'
  Stored in directory: C:\Users\Student\AppData\Local\pip\Cache\wheels\9b\04\dd\7daf4150b6d9b12949298737de9431a324d4b797ffd63f526e
Successfully built docopt
Installing collected packages: dawg-python, pymorphy2-dicts, docopt, pymorphy2
Successfully installed dawg-python-0.7.2 docopt-0.6.2 pymorphy2-0.8 pymorphy2-dicts-2.4.393442.3710985
distributed 1.21.8 requires msgpack, which is not installed.
You are using pip version 10.0.1, however version 19.1.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
In [3]:
from pymorphy2 import MorphAnalyzer
In [4]:
morph = MorphAnalyzer()
In [10]:
m = morph.parse("великолукская")
In [13]:
m[0].normal_form
Out[13]:
'великолукский'
In [14]:
text = """
«Кавказская пленница, или Новые приключения Шурика» — художественный фильм, снятый Леонидом Гайдаем. Сценарий к картине написан Яковом Костюковским и Морисом Слободским (при участии режиссёра). Съёмки проходили в 1966 году в павильонах «Мосфильма», а также в Крыму — на базе Ялтинской киностудии, на Кавказе — в районе Красной Поляны и в Абхазии — в долине озера Рица. Роли исполняли Александр Демьяненко, Наталья Варлей, Владимир Этуш, Фрунзик Мкртчян, Руслан Ахметов, Юрий Никулин, Георгий Вицин и Евгений Моргунов. Действие фильма происходит на Кавказе. В основе сюжета — приключения собирателя фольклора Шурика, который, находясь в южном городе, оказался втянутым в историю с похищением девушки Нины. Инициатор похищения — номенклатурный работник районного масштаба товарищ Саахов; в роли его кунаков выступают персонажи комедийной троицы — Трус, Балбес и Бывалый. 
"""
In [15]:
from string import punctuation
In [17]:
punct = punctuation + "«»—"
In [18]:
import re
In [23]:
f"[{punct}]"
Out[23]:
'[!"#$%&\'()*+,-./:;<=>[email protected][\\]^_`{|}~«»—]'
In [24]:
re.sub('[a-z]', '?', "Комания Microsoft")
Out[24]:
'Комания M????????'
In [29]:
newtext = re.sub(' +', ' ', 
       re.sub("[!\"#$%&\'()*+,./:;<=>[email protected][\\]^_`{|}~«»—\n-]", "", text))
In [33]:
morph.parse("стали")
Out[33]:
[Parse(word='стали', tag=OpencorporaTag('VERB,perf,intr plur,past,indc'), normal_form='стать', score=0.984662, methods_stack=((<DictionaryAnalyzer>, 'стали', 904, 4),)),
 Parse(word='стали', tag=OpencorporaTag('NOUN,inan,femn sing,gent'), normal_form='сталь', score=0.003067, methods_stack=((<DictionaryAnalyzer>, 'стали', 13, 1),)),
 Parse(word='стали', tag=OpencorporaTag('NOUN,inan,femn sing,datv'), normal_form='сталь', score=0.003067, methods_stack=((<DictionaryAnalyzer>, 'стали', 13, 2),)),
 Parse(word='стали', tag=OpencorporaTag('NOUN,inan,femn sing,loct'), normal_form='сталь', score=0.003067, methods_stack=((<DictionaryAnalyzer>, 'стали', 13, 5),)),
 Parse(word='стали', tag=OpencorporaTag('NOUN,inan,femn plur,nomn'), normal_form='сталь', score=0.003067, methods_stack=((<DictionaryAnalyzer>, 'стали', 13, 6),)),
 Parse(word='стали', tag=OpencorporaTag('NOUN,inan,femn plur,accs'), normal_form='сталь', score=0.003067, methods_stack=((<DictionaryAnalyzer>, 'стали', 13, 9),))]
In [35]:
lemmatized_text = " ".join([morph.parse(word)[0].normal_form 
                            for word in newtext.split()])
In [36]:
lemmatized_text
Out[36]:
'кавказский пленница или новое приключение шурик художественный фильм снять леонид гайдавать сценарий к картина написать яков костюковский и морис слободский при участие режиссёр съёмка проходить в 1966 год в павильон мосфильм а также в крым на база ялтинский киностудия на кавказ в район красный поляна и в абхазия в долина озеро рица роль исполнять александр демьяненко наталья варлей владимир этуш фрунзик мкртчян руслан ахмет юрий никулин георгий вицин и евгений моргун действие фильм происходить на кавказ в основа сюжет приключение собиратель фольклор шурик который находиться в южный город оказаться втянутый в история с похищение девушка нина инициатор похищение номенклатурный работник районный масштаб товарищ сааховый в роль он кунак выступать персонаж комедийный троица трус балбес и бывалый'
In [39]:
morph.parse('Новые')
Out[39]:
[Parse(word='новые', tag=OpencorporaTag('NOUN,inan,neut plur,nomn'), normal_form='новое', score=0.4, methods_stack=((<DictionaryAnalyzer>, 'новые', 972, 6),)),
 Parse(word='новые', tag=OpencorporaTag('NOUN,inan,neut plur,accs'), normal_form='новое', score=0.2, methods_stack=((<DictionaryAnalyzer>, 'новые', 972, 9),)),
 Parse(word='новые', tag=OpencorporaTag('ADJF,Qual plur,nomn'), normal_form='новый', score=0.2, methods_stack=((<DictionaryAnalyzer>, 'новые', 405, 20),)),
 Parse(word='новые', tag=OpencorporaTag('ADJF,Qual inan,plur,accs'), normal_form='новый', score=0.2, methods_stack=((<DictionaryAnalyzer>, 'новые', 405, 24),))]
In [42]:
word = morph.parse('вентилятор')[0]
In [49]:
word.inflect({'plur', 'datv'})
Out[49]:
Parse(word='вентиляторам', tag=OpencorporaTag('NOUN,inan,masc plur,datv'), normal_form='вентилятор', score=1.0, methods_stack=((<DictionaryAnalyzer>, 'вентиляторам', 33, 8),))
In [54]:
morph.parse('Викторович')
Out[54]:
[Parse(word='викторович', tag=OpencorporaTag('NOUN,anim,masc,Patr sing,nomn'), normal_form='виктор', score=1.0, methods_stack=((<DictionaryAnalyzer>, 'викторович', 26, 12),))]
In [55]:
!{sys.executable} -m pip install natasha
Collecting natasha
  Downloading https://files.pythonhosted.org/packages/4b/9d/3330c5a8c98f45a6f090cc8bfaa1132a58ead75cedec5ac758b2999bf34c/natasha-0.10.0-py2.py3-none-any.whl (777kB)
Collecting yargy (from natasha)
  Downloading https://files.pythonhosted.org/packages/37/64/d6abf637228bed6b0249b522f588d19dca9f09ab65db13bef41096f51889/yargy-0.12.0-py2.py3-none-any.whl (41kB)
Requirement already satisfied: pymorphy2==0.8 in d:\anaconda3\lib\site-packages (from yargy->natasha) (0.8)
Collecting backports.functools-lru-cache==1.3 (from yargy->natasha)
  Downloading https://files.pythonhosted.org/packages/d4/40/0b1db94fdfd71353ae67ec444ff28e0a7ecc25212d1cb94c291b6cd226f9/backports.functools_lru_cache-1.3-py2.py3-none-any.whl
Requirement already satisfied: dawg-python>=0.7 in d:\anaconda3\lib\site-packages (from pymorphy2==0.8->yargy->natasha) (0.7.2)
Requirement already satisfied: pymorphy2-dicts<3.0,>=2.4 in d:\anaconda3\lib\site-packages (from pymorphy2==0.8->yargy->natasha) (2.4.393442.3710985)
Requirement already satisfied: docopt>=0.6 in d:\anaconda3\lib\site-packages (from pymorphy2==0.8->yargy->natasha) (0.6.2)
Installing collected packages: backports.functools-lru-cache, yargy, natasha
Successfully installed backports.functools-lru-cache-1.3 natasha-0.10.0 yargy-0.12.0
distributed 1.21.8 requires msgpack, which is not installed.
You are using pip version 10.0.1, however version 19.1.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
In [65]:
from natasha import NamesExtractor, PersonExtractor
In [71]:
extractor = NamesExtractor()
In [72]:
names = extractor(text)
In [75]:
for name in names.matches:
    print(name.fact)
Name(first='шурик', middle=None, last=None, nick=None)
Name(first='леонид', middle=None, last='гайдай', nick=None)
Name(first='яков', middle=None, last='костюковский', nick=None)
Name(first='морис', middle=None, last='слободский', nick=None)
Name(first='александр', middle=None, last='демьяненко', nick=None)
Name(first='наталья', middle=None, last=None, nick=None)
Name(first='варлей', middle=None, last=None, nick=None)
Name(first='владимир', middle=None, last='этуш', nick=None)
Name(first=None, middle=None, last='мкртчян', nick=None)
Name(first='руслан', middle=None, last='ахметов', nick=None)
Name(first='юрий', middle=None, last='никулин', nick=None)
Name(first='георгий', middle=None, last='вицин', nick=None)
Name(first='евгения', middle=None, last='моргун', nick=None)
Name(first='шурик', middle=None, last=None, nick=None)
Name(first='нина', middle=None, last=None, nick=None)
In [85]:
extractor('Виталий Витальевич Корейко').matches[0].fact
Out[85]:
Name(first='виталий',
     middle='виталиевич',
     last='корейко',
     nick=None)
In [86]:
from natasha import MoneyExtractor
In [87]:
find_money = MoneyExtractor()
In [99]:
find_money("По цене в 12 руб. 10 коп. за штуку и 25 руб. за три штуки")[0].fact
Out[99]:
Money(integer=12,
      fraction=None,
      multiplier=None,
      currency='RUB',
      coins=10)
In [104]:
find_money("По цене в 12 руб. 10 коп. за штуку и 25$ за три штуки")[1].fact
Out[104]:
Money(integer=25,
      fraction=None,
      multiplier=None,
      currency='USD',
      coins=None)
In [105]:
from natasha import MoneyRangeExtractor
In [106]:
extr = MoneyRangeExtractor()
In [109]:
extr("От 2 до 3 тыс. рублей")[0].fact
Out[109]:
Range(min=Money(integer=2,
                fraction=None,
                multiplier=None,
                currency=None,
                coins=None),
      max=Money(integer=3,
                fraction=None,
                multiplier=1000,
                currency='RUB',
                coins=None))
In [117]:
from yargy import Parser, rule, and_
from yargy.predicates import gram, is_capitalized, dictionary


GEO = rule(
    and_(
        gram('ADJF'),  # так помечается прилагательное, остальные пометки описаны в
                       # http://pymorphy2.readthedocs.io/en/latest/user/grammemes.html
        is_capitalized()
    ),
#    gram('ADJF').optional().repeatable(),
    dictionary({
        'федерация',
        'республика'
    })
)
In [118]:
parser = Parser(GEO)
In [119]:
text = '''
В Чеченской республике на день рождения ...
Донецкая народная республика провозгласила ...
Башня Федерация — одна из самых высоких ...
'''
parser.find(text)
Out[119]:
Match([MorphToken('Чеченской',
                  [3, 12),
                  'RU',
                  [Form('чеченский', Grams(ADJF,femn,loct,sing)),
                   Form('чеченский', Grams(ADJF,femn,gent,sing)),
                   Form('чеченский', Grams(ADJF,datv,femn,sing)),
                   Form('чеченский', Grams(ADJF,ablt,femn,sing))]),
       MorphToken('республике',
                  [13, 23),
                  'RU',
                  [Form('республика', Grams(NOUN,femn,inan,loct,sing)),
                   Form('республика', Grams(NOUN,datv,femn,inan,sing))])],
      [3, 23))
In [120]:
!{sys.executable} -m pip install textblob
Collecting textblob
  Downloading https://files.pythonhosted.org/packages/60/f0/1d9bfcc8ee6b83472ec571406bd0dd51c0e6330ff1a51b2d29861d389e85/textblob-0.15.3-py2.py3-none-any.whl (636kB)
Requirement already satisfied: nltk>=3.1 in d:\anaconda3\lib\site-packages (from textblob) (3.3)
Requirement already satisfied: six in d:\anaconda3\lib\site-packages (from nltk>=3.1->textblob) (1.11.0)
Installing collected packages: textblob
Successfully installed textblob-0.15.3
distributed 1.21.8 requires msgpack, which is not installed.
You are using pip version 10.0.1, however version 19.1.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
In [123]:
from textblob import TextBlob
In [124]:
text = TextBlob("This is very nice movie!")
In [126]:
text.detect_language()
Out[126]:
'en'
In [127]:
text.sentiment
Out[127]:
Sentiment(polarity=0.9750000000000001, subjectivity=1.0)
In [128]:
TextBlob("This is very nice movie").sentiment
Out[128]:
Sentiment(polarity=0.78, subjectivity=1.0)
In [130]:
TextBlob("This is far from good movie").sentiment
Out[130]:
Sentiment(polarity=0.39999999999999997, subjectivity=0.8)
In [132]:
TextBlob("This is not so good movie").sentiment
Out[132]:
Sentiment(polarity=0.7, subjectivity=0.6000000000000001)
In [133]:
# NLTK - Natural Language Toolkit
In [137]:
blob = TextBlob("Мама мыла раму")
In [139]:
blob.detect_language()
Out[139]:
'ru'
In [143]:
import nltk
nltk.download('punkt')
[nltk_data] Error loading punkt: <urlopen error [WinError 10060]
[nltk_data]     Попытка установить соединение была безуспешной, т.к.
[nltk_data]     от другого компьютера за требуемое время не получен
[nltk_data]     нужный отклик, или было разорвано уже установленное
[nltk_data]     соединение из-за неверного отклика уже подключенного
[nltk_data]     компьютера>
Out[143]:
False
In [140]:
blob.pos_tags
**********************************************************************
  Resource punkt not found.
  Please use the NLTK Downloader to obtain the resource:

  >>> import nltk
  >>> nltk.download('punkt')
  
  Searched in:
    - 'C:\\Users\\Student/nltk_data'
    - 'C:\\nltk_data'
    - 'D:\\nltk_data'
    - 'E:\\nltk_data'
    - 'D:\\Anaconda3\\nltk_data'
    - 'D:\\Anaconda3\\share\\nltk_data'
    - 'D:\\Anaconda3\\lib\\nltk_data'
    - 'C:\\Users\\Student\\AppData\\Roaming\\nltk_data'
    - ''
**********************************************************************

---------------------------------------------------------------------------
LookupError                               Traceback (most recent call last)
D:\Anaconda3\lib\site-packages\textblob\decorators.py in decorated(*args, **kwargs)
     34         try:
---> 35             return func(*args, **kwargs)
     36         except LookupError as err:

D:\Anaconda3\lib\site-packages\textblob\tokenizers.py in tokenize(self, text)
     56         '''Return a list of sentences.'''
---> 57         return nltk.tokenize.sent_tokenize(text)
     58 

D:\Anaconda3\lib\site-packages\nltk\tokenize\__init__.py in sent_tokenize(text, language)
     93     """
---> 94     tokenizer = load('tokenizers/punkt/{0}.pickle'.format(language))
     95     return tokenizer.tokenize(text)

D:\Anaconda3\lib\site-packages\nltk\data.py in load(resource_url, format, cache, verbose, logic_parser, fstruct_reader, encoding)
    835     # Load the resource.
--> 836     opened_resource = _open(resource_url)
    837 

D:\Anaconda3\lib\site-packages\nltk\data.py in _open(resource_url)
    953     if protocol is None or protocol.lower() == 'nltk':
--> 954         return find(path_, path + ['']).open()
    955     elif protocol.lower() == 'file':

D:\Anaconda3\lib\site-packages\nltk\data.py in find(resource_name, paths)
    674     resource_not_found = '\n%s\n%s\n%s\n' % (sep, msg, sep)
--> 675     raise LookupError(resource_not_found)
    676 

LookupError: 
**********************************************************************
  Resource punkt not found.
  Please use the NLTK Downloader to obtain the resource:

  >>> import nltk
  >>> nltk.download('punkt')
  
  Searched in:
    - 'C:\\Users\\Student/nltk_data'
    - 'C:\\nltk_data'
    - 'D:\\nltk_data'
    - 'E:\\nltk_data'
    - 'D:\\Anaconda3\\nltk_data'
    - 'D:\\Anaconda3\\share\\nltk_data'
    - 'D:\\Anaconda3\\lib\\nltk_data'
    - 'C:\\Users\\Student\\AppData\\Roaming\\nltk_data'
    - ''
**********************************************************************


During handling of the above exception, another exception occurred:

MissingCorpusError                        Traceback (most recent call last)
<ipython-input-140-226ea7729c2f> in <module>()
----> 1 blob.pos_tags

D:\Anaconda3\lib\site-packages\textblob\decorators.py in __get__(self, obj, cls)
     22         if obj is None:
     23             return self
---> 24         value = obj.__dict__[self.func.__name__] = self.func(obj)
     25         return value
     26 

D:\Anaconda3\lib\site-packages\textblob\blob.py in pos_tags(self)
    482         """
    483         if isinstance(self, TextBlob):
--> 484             return [val for sublist in [s.pos_tags for s in self.sentences] for val in sublist]
    485         else:
    486             return [(Word(unicode(word), pos_tag=t), unicode(t))

D:\Anaconda3\lib\site-packages\textblob\decorators.py in __get__(self, obj, cls)
     22         if obj is None:
     23             return self
---> 24         value = obj.__dict__[self.func.__name__] = self.func(obj)
     25         return value
     26 

D:\Anaconda3\lib\site-packages\textblob\blob.py in sentences(self)
    637     def sentences(self):
    638         """Return list of :class:`Sentence <Sentence>` objects."""
--> 639         return self._create_sentence_objects()
    640 
    641     @cached_property

D:\Anaconda3\lib\site-packages\textblob\blob.py in _create_sentence_objects(self)
    681         '''
    682         sentence_objects = []
--> 683         sentences = sent_tokenize(self.raw)
    684         char_index = 0  # Keeps track of character index within the blob
    685         for sent in sentences:

D:\Anaconda3\lib\site-packages\textblob\base.py in itokenize(self, text, *args, **kwargs)
     62         :rtype: generator
     63         """
---> 64         return (t for t in self.tokenize(text, *args, **kwargs))
     65 
     66 ##### SENTIMENT ANALYZERS ####

D:\Anaconda3\lib\site-packages\textblob\decorators.py in decorated(*args, **kwargs)
     36         except LookupError as err:
     37             print(err)
---> 38             raise MissingCorpusError()
     39     return decorated

MissingCorpusError: 
Looks like you are missing some required data for this feature.

To download the necessary data, simply run

    python -m textblob.download_corpora

or use the NLTK downloader to download the missing data: http://nltk.org/data.html
If this doesn't fix the problem, file an issue at https://github.com/sloria/TextBlob/issues.
In [ ]: