рдкрд╛рдпрдерди рдФрд░ TextBlob рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕реЗрдВрдЯреАрдореЗрдВрдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдг

рдЫрд╡рд┐

рдПрдХ рд╡рд┐рдХрд╛рд╕ рдЯреАрдо рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬреЛ рдЕрднреА рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реИ? рдПрдХреАрдХрд░рдг рдФрд░ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░, рдШрдЯрдХ, рдкрд░реАрдХреНрд╖рдг рдХреНрд╖рдорддрд╛рдПрдВ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдмрдирд╛рддреА рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИрдВред рдФрд░ рд╢реНрд░рдо рдЗрдирдкреБрдЯ, рдпреЛрдЬрдирд╛ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗред

рдпрд╣ рд▓реЗрдЦ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдЧрд╛ред рдЬрд┐рд╕реЗ рдкреНрд░реЛрдбрдХреНрдЯ рдореИрдиреЗрдЬрд░ рдХреЗ рд╕рд╛рде рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рд╕рдордп рдмрд╛рдж рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛: рд╣рдо рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдХреЛ "рдЯрдЪ" рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддреЗ? рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдПрдирдПрд▓рдкреА рдФрд░ рд╕реЗрдВрдЯреАрдореЗрдВрдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдг?

"рдХреНрдпреЛрдВ рдирд╣реАрдВ?" рдореИрдВрдиреЗ рдЬрд╡рд╛рдм рджрд┐рдпрд╛ред рдлрд┐рд░ рднреА, рдореИрдВ 15 рд╕реЗ рдЕрдзрд┐рдХ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдмреИрдХрдПрдВрдб рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реВрдВ, рдореБрдЭреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдкрд╕рдВрдж рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдерд╛ рдХрд┐ "рдЦрд░рдЧреЛрд╢ рдЫреЗрдж рдХрд┐рддрдирд╛ рдЧрд╣рд░рд╛ рд╣реИ"ред

рдШрдЯрдХреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ


рд╣рдорд╛рд░реЗ рдПрдордПрд▓ рдХрд░реНрдиреЗрд▓ рдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдХреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП, GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рдХрдИ рдореЗрдВ рд╕реЗ рдПрдХ, рднрд╛рд╡рдирд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред

рдкрд╛рдпрдерди рдореЗрдВ рднрд╛рд╡рдирд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
import collections import nltk import os from sklearn import ( datasets, model_selection, feature_extraction, linear_model ) def extract_features(corpus): '''Extract TF-IDF features from corpus''' # vectorize means we turn non-numerical data into an array of numbers count_vectorizer = feature_extraction.text.CountVectorizer( lowercase=True, # for demonstration, True by default tokenizer=nltk.word_tokenize, # use the NLTK tokenizer stop_words='english', # remove stop words min_df=1 # minimum document frequency, ie the word must appear more than once. ) processed_corpus = count_vectorizer.fit_transform(corpus) processed_corpus = feature_extraction.text.TfidfTransformer().fit_transform( processed_corpus) return processed_corpus data_directory = 'movie_reviews' movie_sentiment_data = datasets.load_files(data_directory, shuffle=True) print('{} files loaded.'.format(len(movie_sentiment_data.data))) print('They contain the following classes: {}.'.format( movie_sentiment_data.target_names)) movie_tfidf = extract_features(movie_sentiment_data.data) X_train, X_test, y_train, y_test = model_selection.train_test_split( movie_tfidf, movie_sentiment_data.target, test_size=0.30, random_state=42) # similar to nltk.NaiveBayesClassifier.train() model = linear_model.LogisticRegression() model.fit(X_train, y_train) print('Model performance: {}'.format(model.score(X_test, y_test))) y_pred = model.predict(X_test) for i in range(5): print('Review:\n{review}\n-\nCorrect label: {correct}; Predicted: {predict}'.format( review=X_test[i], correct=y_test[i], predict=y_pred[i] )) 


рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЪреБрдиреМрддреА рд╣реИред
рдХреЛрдб рдХреА рдХреЗрд╡рд▓ 45 рд▓рд╛рдЗрдиреЗрдВ, рдФрд░ 4 (рдЪрд╛рд░, рдХрд╛рд░реНрд▓!) рдПрдХ рдмрд╛рд░ рдореЗрдВ рддрд╛рд░реНрдХрд┐рдХ рдмреНрд▓реЙрдХ:

  1. рдореЙрдбрд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ (рд▓рд╛рдЗрдиреЗрдВ 25-26)
  2. рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ - рд╕реБрд╡рд┐рдзрд╛ рдирд┐рд╖реНрдХрд░реНрд╖рдг (рд▓рд╛рдЗрдиреЗрдВ 31-34)
  3. рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рдирд╛ рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг (рд▓рд╛рдЗрдиреЗрдВ 36-39)
  4. рдПрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдореЙрдбрд▓ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ (рд▓рд╛рдЗрдиреЗрдВ 41-45)

рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рдпреЛрдЧреНрдп рд╣реИред рдФрд░ рдЗрд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрдВрдЬреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХрдо рд╕реЗ рдХрдо рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдПред

рдЕрд▓рдЧ-рдЕрд▓рдЧ, рдпрд╣ рдбреЗрдЯрд╛ рддреИрдпрд╛рд░реА рдФрд░ рдореЙрдбрд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред
рдореЙрдбрд▓ рдХреЛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдмрдирд╛рдиреЗ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрд░реАрдХреЗ рдореЗрдВ, рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдФрд░ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕реИрдХрдбрд╝реЛрдВ рдШрдВрдЯреЗ рдХрд╛ рдирд┐рд╡реЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдПрдирдПрд▓рдкреА рдХреЗ рд╕рд╛рде рдЬрд▓реНрджреА рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рд╣реИ - рдПрдирдПрд▓рдЯреАрдХреЗ рдФрд░ рдЯреЗрдХреНрд╕реНрдЯрдмреНрд▓реЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА ред рджреВрд╕рд░рд╛ NLTK рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИ рдЬреЛ рдХреЛрд░ рдХрд░рддрд╛ рд╣реИ - рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗрдЯ рд╕реЗ рд╕реБрд╡рд┐рдзрд╛ рдирд┐рд╖реНрдХрд░реНрд╖рдг рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдореЙрдбрд▓ рдХреЛ рдкрд╣рд▓реЗ рд╡рд░реНрдЧреАрдХрд░рдг рдЕрдиреБрд░реЛрдз рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛


рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ


рдЕрдЧрд░ рд╣рдо рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ CSV / TSV рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдирд╛ рдкреНрд░рд╛рдердорд┐рдХ рд╣реИред рдЖрдк рдмрд╕ рдкрдВрдбреЛрдВ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ read_csv рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ:

 import pandas as pd data = pd.read_csv(data_path, delimiter) 

рд▓реЗрдХрд┐рди рдпрд╣ рдореЙрдбрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрдЧрд░ рд╣рдо csv рдкреНрд░рд╛рд░реВрдк рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд░реЛрдд рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд░реЛрдд-рдирд┐рд░реНрднрд░ рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реАрдПрд╕рд╡реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕реАрдорд╛рдВрдХрдХ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреМрди рд╕реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реИрдВ рдФрд░ рдХреМрди рд╕реА рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реИрдВред рдмреЗрд╢рдХ, рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ рдЙрди рдбреЗрдЯрд╛рд╕реЗрдЯреЛрдВ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХреА рдЧрдИ рд╣реИ рдЬрд┐рдирдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреЙрд╕ / рдиреЗрдЧреЗрдЯрд┐рд╡ рдХрд╛ рд╕рдВрдХреЗрдд 0 рдпрд╛ 1 рд╣реИ, рджреВрд╕рд░реЗ рдореЗрдВ рдпрд╣ рдПрдХ рд▓реЙрдЬрд┐рдХрд▓ рдЯреНрд░реВ / рдлрд╛рд▓реНрд╕ рд╣реИ, рддреАрд╕рд░реЗ рдореЗрдВ рдпрд╣ рд╕рд┐рд░реНрдл рдкреЙрдЬ / рдиреЗрдЧреЗрдЯрд┐рд╡ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рдорд╛рдорд▓реЗ рдореЗрдВ, 0 рд╕реЗ 5 рдХреЗ рдмреАрдЪ рдкреВрд░реНрдгрд╛рдВрдХ рдХрд╛ рдЯреНрдпреВрдкрд▓ рд╣реИред рдмрд╛рдж рд╡рд╛рд▓рд╛ рдорд▓реНрдЯреАрд╕реНрдХреЗрд▓реНрд╕ рд╡рд░реНрдЧреАрдХрд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕рдиреЗ рдХрд╣рд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдЗрдирд░реА рд╡рд░реНрдЧреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЖрдкрдХреЛ рдмрд╕ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдФрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рдореВрд▓реНрдпреЛрдВ рдХреА рд╕реАрдорд╛ рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдкрд╣рдЪрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореИрдВ рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛ рд╕реЗрдЯреЛрдВ рдкрд░ рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдФрд░ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐, рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдмрд╛рдж, рдореЙрдбрд▓ рдПрдХ рдПрдХрд▓ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд╡рд┐рд╖рдо рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд╣реА рд░реВрдк рдореЗрдВ рд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рд▓рд┐рдП, рддреАрди рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рдЪрд░рдг рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  1. рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рд╕реЗ рдХрдиреЗрдХреНрд╢рди CSV рдХреЗ рд▓рд┐рдП рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕реЗ read_csv рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ;
  2. рдкреНрд░рд╛рд░реВрдк рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди;
  3. рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рддреИрдпрд╛рд░реАред

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдпрд╣ рдХреЛрдб рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИред

 import numpy as np # linear algebra import pandas as pd # data processing, CSV file I/O (eg pd.read_csv) import logging log = logging.getLogger() class CsvSentimentDataLoader(): def __init__(self, file_path, delim, text_attr, rate_attr, pos_rates): self.data_path = file_path self.delimiter = delim self.text_attr = text_attr self.rate_attr = rate_attr self.pos_rates = pos_rates def load_data(self): #     csv  tsv  data = pd.read_csv(self.data_path, self.delimiter) data.head() #   , #      data = data[[self.text_attr, self.rate_attr]] #    #     'pos'  'neg' data[self.rate_attr] = np.where( data[self.rate_attr].isin(self.pos_rates), 'pos', 'neg') return data 

рд╡рд░реНрдЧ CsvSentimentDataLoader рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ csv, рд╡рд┐рднрд╛рдЬрдХ, рдкрд╛рда рдФрд░ рд╡рд░реНрдЧреАрдХрд░рдг рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкрд╛рда рдХреЗ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдореВрд▓реНрдп рдХреА рд╕рд▓рд╛рд╣ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрддрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд▓реЛрдбрд┐рдВрдЧ рд╕реНрд╡рдпрдВ рд▓реЛрдб_рдбреЗрдЯрд╛ рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реЛрддреА рд╣реИред

рд╣рдо рдбреЗрдЯрд╛ рдХреЛ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗрдЯреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ


рдареАрдХ рд╣реИ, рд╣рдордиреЗ рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрднреА рднреА рдЗрд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдпрд╣ sklearn рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ train_test_split рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛рд╕реЗрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯреНрд░реЗрди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХреИрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрдЧрд╛ред рдпреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯреЛрдВ рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╢рд╛рдпрдж рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ (рдЪрд▓реЛ рдЗрд╕реЗ рд╕рд┐рдореНрдкрд▓рдбреЙрдЯрд╕рдкреНрд▓рд┐рдЯрд░ рдХрд╣рддреЗ рд╣реИрдВ) рдЬреЛ рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдЧрд╛ рдФрд░ рдХреЙрд▓ рдХреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХрддреНрд░ рдХрд░реЗрдЧрд╛ред

 from sklearn.model_selection import train_test_split # to split the training and testing data import logging log = logging.getLogger() class SimpleDataSplitter(): def __init__(self, text_attr, rate_attr, test_part_size=.3): self.text_attr = text_attr self.rate_attr = rate_attr self.test_part_size = test_part_size def split_data(self, data): x = data[self.text_attr] y = data[self.rate_attr] x_train, x_test, y_train, y_test = train_test_split( x, y, test_size = self.test_part_size) return x_train, x_test, y_train, y_test 

рдЕрдм рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрдиреЗ рдкрд░, рдХреЗрд╡рд▓ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдЧрд╛ - рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдкреНрд░рддрд┐рд╢рдд рдЬрд┐рд╕реЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдбреЗрдЯрд╛рд╕реЗрдЯ


рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕реАрдПрд╕рд╡реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рдбреЗрдЯрд╛рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:


рдФрд░ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╕реАрдПрд╕рд╡реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред

 import os import collections import logging from web.data.loaders import CsvSentimentDataLoader from web.data.splitters import SimpleDataSplitter, TdIdfDataSplitter log = logging.getLogger() class AmazonAlexaDataset(): def __init__(self): self.file_path = os.path.normpath(os.path.join(os.path.dirname(__file__), 'amazon_alexa/train.tsv')) self.delim = '\t' self.text_attr = 'verified_reviews' self.rate_attr = 'feedback' self.pos_rates = [1] self.data = None self.train = None self.test = None def load_data(self): loader = CsvSentimentDataLoader(self.file_path, self.delim, self.text_attr, self.rate_attr, self.pos_rates) splitter = SimpleDataSplitter(self.text_attr, self.rate_attr, test_part_size=.3) self.data = loader.load_data() x_train, x_test, y_train, y_test = splitter.split_data(self.data) self.train = [x for x in zip(x_train, y_train)] self.test = [x for x in zip(x_test, y_test)] 

рд╣рд╛рдВ, рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЛрдб рдХреА 5 рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдирд┐рдХрд▓рд╛ред
рд▓реЗрдХрд┐рди рдЕрдм рдбреЗрдЯрд╛ рд╕реНрд░реЛрддреЛрдВ рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗрдЯ рддреИрдпрд╛рд░реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдорджрдж рд╕реЗ рдирдП рдбреЗрдЯрд╛рд╕реЗрдЯ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рдкреНрд▓рд╕, рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рдШрдЯрдХ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВред

рд╣рдо рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ


рдореЙрдбрд▓ рдХрд╛рдлреА рд╕рдордп рд╕реЗ рд╕реАрдЦ рд░рд╣реА рд╣реИред рдФрд░ рдпрд╣ рдПрдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрд╡реЗрджрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВред
рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЫреЛрдЯрд╛ рдЖрд╡рд░рдг рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЖрд╡реЗрджрди рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдХреЗ рд╕рдордп рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред

 class TextBlobWrapper(): def __init__(self): self.log = logging.getLogger() self.is_model_trained = False self.classifier = None def init_app(self): self.log.info('>>>>> TextBlob initialization started') self.ensure_model_is_trained() self.log.info('>>>>> TextBlob initialization completed') def ensure_model_is_trained(self): if not self.is_model_trained: ds = SentimentLabelledDataset() ds.load_data() # train the classifier and test the accuracy self.classifier = NaiveBayesClassifier(ds.train) acr = self.classifier.accuracy(ds.test) self.log.info(str.format('>>>>> NaiveBayesClassifier trained with accuracy {}', acr)) self.is_model_trained = True return self.classifier 

рдкрд╣рд▓реЗ рд╣рдо рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдбреЗрдЯрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рдлреАрдЪрд░ рдирд┐рд╖реНрдХрд░реНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ рд╣рдо рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдЯреНрд░реЗрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ рдкрд░ рд╕рдЯреАрдХрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред

рдкрд░реАрдХреНрд╖рдг


рдЖрд░рдВрдн рдХрд░рдиреЗ рдкрд░, рд╣рдореЗрдВ рдПрдХ рд▓реЙрдЧ рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдореЙрдбрд▓ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫреА (рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП) рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд - 0.8878ред

рдЫрд╡рд┐

рдЗрд╕ рддрд░рд╣ рдХреЗ рдирдВрдмрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдмрд╣реБрдд рдЙрддреНрд╕рд╛рд╣реА рдерд╛ред рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдЖрдирдВрдж, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдирд╣реАрдВ рдерд╛ред рдЗрд╕ рд╕реЗрдЯ рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдореЙрдбрд▓ рдПрдХ рдЕрднреЗрджреНрдп рдЖрд╢рд╛рд╡рд╛рджреА рд╣реИ рдФрд░ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдирдХрд╛рд░рд╛рддреНрдордХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред

рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗрдЯ рдбреЗрдЯрд╛ рдореЗрдВ рд╣реИред рд╕реЗрдЯ рдореЗрдВ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 90% рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рд▓рдЧрднрдЧ 88% рдХреА рдореЙрдбрд▓ рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде, рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдореАрдХреНрд╖рд╛ рдХреЗрд╡рд▓ 12% рдЧрд▓рдд рд╡рд░реНрдЧреАрдХрд░рдгреЛрдВ рдореЗрдВ рдЖрддреА рд╣реИред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗрдЯ рдХреЗ рд╕рд╛рде, рдирдХрд╛рд░рд╛рддреНрдордХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬреЛ рдХрд┐ рдПрдХ рдФрд░ рдбреЗрдЯрд╛ рд╕реЗрдЯ рд╕реЗ 100 рд╕рдХрд╛рд░рд╛рддреНрдордХ рдФрд░ 100 рдирдХрд╛рд░рд╛рддреНрдордХ рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ рд╡рд░реНрдЧреАрдХрд░рдг рдЪрд▓рд╛рддрд╛ рд╣реИ - рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдХреИрд▓рд┐рдлреЛрд░реНрдирд┐рдпрд╛ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рд╕реЗ рд╕реЗрдВрдЯреАрдореЗрдВрдЯ рд▓реЗрдмрд▓ рд╡рд╛рд▓реЗ рд╕реЗрдВрдЯреЗрдВрд╕ рдбреЗрдЯрд╛ рд╕реЗрдЯ рд▓рд┐рдпрд╛ред

  @loggingtestcase.capturelogs(None, level='INFO') def test_classifier_on_separate_set(self, logs): tb = TextBlobWrapper() # Going to be trained on Amazon Alexa dataset ds = SentimentLabelledDataset() # Test dataset ds.load_data() # Check poisitives true_pos = 0 data = ds.data.to_numpy() seach_mask = np.isin(data[:, 1], ['pos']) data = data[seach_mask][:100] for e in data[:]: # Model train will be performed on first classification call r = tb.do_sentiment_classification(e[0]) if r == e[1]: true_pos += 1 self.assertLessEqual(true_pos, 100) print(str.format('\n\nTrue Positive answers - {} of 100', true_pos)) 

рд╕рдХрд╛рд░рд╛рддреНрдордХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╡рд░реНрдЧреАрдХрд░рдг рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

  • рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ;
  • 'рдкреЙрд╕' рдЯреИрдЧ рдХреА рдЧрдИ 100 рдкреЛрд╕реНрдЯ рд▓реЗрдВ
  • рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдореЙрдбрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕рд╣реА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ
  • рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред

рдЗрд╕реА рддрд░рд╣, рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдирдХрд╛рд░рд╛рддреНрдордХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдИ рдЧрдИ рд╣реИред

рдкрд░рд┐рдгрд╛рдо
рдЫрд╡рд┐

рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рд╕рднреА рдирдХрд╛рд░рд╛рддреНрдордХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреНрдпрддрд╛ рджреА рдЧрдИ рдереАред

рдФрд░ рдпрджрд┐ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рд╕реЗрдВрдЯреАрдореЗрдВрдЯ рд▓реЗрдмрд▓ ? рд╡рд╣рд╛рдВ, рдирдХрд╛рд░рд╛рддреНрдордХ рдФрд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рддрд░рдг рдмрд┐рд▓реНрдХреБрд▓ 50 рд╕реЗ 50 рд╣реИред

рдХреЛрдб рдмрджрд▓реЗрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ, рдЪрд▓рд╛рдПрдВ
рдЫрд╡рд┐

рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реАред рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╕реЗрдЯ рд╕реЗ 200 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдЯреАрдХрддрд╛ 76% рд╣реИ, рдЬрдмрдХрд┐ рдирдХрд╛рд░рд╛рддреНрдордХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╡рд░реНрдЧреАрдХрд░рдг рдХреА рд╕рдЯреАрдХрддрд╛ 79% рд╣реИред

рдмреЗрд╢рдХ, 76% рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рд╕рдЯреАрдХрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрд╛рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрдиреНрдп рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рд╣реИред

рдкрд░рд┐рдгрд╛рдо


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдХ рджрд░реНрдЬрди рд╡рд░реНрдЧреЛрдВ рдФрд░ рдХреЛрдб рдХреЗ 200 + рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд╡реЗрджрди рдорд┐рд▓рд╛, рдЬреЛ рдореВрд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 30 рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╣реИред рдФрд░ рдЖрдкрдХреЛ рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдпреЗ рд╕рд┐рд░реНрдл рд╕рдВрд░рдЪрдирд╛ рдкрд░ рд╕рдВрдХреЗрдд рд╣реИрдВ, рднрд╡рд┐рд╖реНрдп рдХреЗ рдЖрд╡реЗрджрди рдХреА рд╕реАрдорд╛рдУрдВ рдХрд╛ рдкрд╣рд▓рд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгред рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкред

рдФрд░ рдЗрд╕ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдиреЗ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджрд┐рдпрд╛ рдХрд┐ рдХреЛрдб рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдФрд░ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХрд┐рддрдиреА рджреВрд░ рд╣реИред рдФрд░ рдпрд╣, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдХрдард┐рдирд╛рдИ рд╣реИ рдЬреЛ рдорд╢реАрди рд╕реАрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВред

рдЕрдЧрд▓реА рдЪреАрдЬ рдЬреЛ рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЛ рдПрдХ рдмреЗрд╡рдХреВрдлрд╝ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреА рд╣реИ - рдбреЗрдЯрд╛ рдЪрдпрдирд┐рдд рдореЙрдбрд▓ рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдмрд╛рдд рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣рдореЗрд╢рд╛ рдмрдиреА рд░рд╣рддреА рд╣реИ рдХрд┐ рдХреБрдЫ рдбреЗрдЯрд╛ рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдПрдХ рдореЙрдбрд▓ рдЦреБрдж рдХреЛ рджреВрд╕рд░реЛрдВ рдкрд░ рдЕрдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдПрдЧрд╛, рдпрд╛ рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдЗрд╕рдХреА рд╕рдЯреАрдХрддрд╛ рдХрдо рд╣реЛрдиреЗ рд▓рдЧреЗрдЧреАред
рддрджрдиреБрд╕рд╛рд░, рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдореЙрдбрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд▓рдЪреАрд▓рд╛рдкрди, рдордХреНрдЦреА рдкрд░ рд╕реАрдЦрдиреЗ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рддрдХрдиреАрдХреА рдХреНрд╖рдорддрд╛ред рдФрд░ рдЗрд╕реА рддрд░рд╣ред

рдореЗрд░реЗ рд▓рд┐рдП, рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рдпрд╣ рд╕рдм рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, "рдЦрд░рдЧреЛрд╢ рдЫреЗрдж" рди рдХреЗрд╡рд▓ рдмрд╣реБрдд рдЧрд╣рд░рд╛ рдерд╛, рдмрд▓реНрдХрд┐ рдмреЗрд╣рдж рдЪрддреБрд░рд╛рдИ рд╕реЗ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рд╕рднреА рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВред

Source: https://habr.com/ru/post/hi457168/


All Articles