Друзья, добрый день.
Есть четкое понимание, что большая часть ICO проектов это по сути своей совсем нематериальный актив. ICO проект это не автомобиль мерседес-бенц – который ездит вне зависимости от того что его кто любит или нет. И основное влияние на ICO оказывает настроение народа – как настрой на основателя\founder ICO, так и самого проекта.
Было бы хорошо как-то измерить настрой народа по отношению к основателю ICO и\или к ICO проекту. Что и было проделано. Отчет ниже.
Результатом стал инструмент сбора позитивного\негативного настроения из Интернетов, в частности из твиттера.
Моё окружение это Windows 10 x64, использовал язык Python 3 в редакторе Spyder в Anaconda 5.1.0, проводное подключение к сети.
Сбор данных
Настрой буду получать из постов твиттера. Сначала выясню, чем сейчас занимается основатель ICO и насколько положительно об этом отзываются на примере пары известных личностей.
Буду использовать python библиотеку tweepy. Для работы с твиттером необходимо в нем зарегистрироваться как разработчику, см. twitter/. Получить критерии доступа к твиттеру.
Код получается такой:
import tweepy API_KEY = "8CtrEXQWhuF1fhAqAtoXRRIxU" API_SECRET = "uVXS30kspvqiezyPc26JafhRjRiZH3K12SGNgT0Ndsqu17zQt3" ACCESS_TOKEN = "2748712098-WBn6rZR4lXsnZCwcuU0aOsRkENSGpw2lppAJeHt" ACCESS_TOKEN_SECRET = "pKdSlG7APRc5yGiWY5xFKfIGpqkHnXAvuwwVzMwyyuzcD" auth = tweepy.OAuthHandler(API_KEY, API_SECRET) auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET) api = tweepy.API(auth)
Теперь мы сможем обратиться к API твиттера и что-то от него получить или наоборот запостить. Дело делалось в первых числах августа. Нужно получить сколько-то твиттов для поиска актуального проекта основателя. Искал так:
import pandas as pd searchstring = searchinfo+' -filter:retweets' results = pd.DataFrame() coursor = tweepy.Cursor(api.search, q=searchstring, since="2018-07-07", lang="en", count = 500) for tweet in coursor.items(): my_series = pd.Series([str(tweet.id), tweet.created_at, tweet.text, tweet.retweeted], index=['id', 'title', 'text', 'retweeted']) result = pd.DataFrame(my_series).transpose() results = results.append(result, ignore_index = True) results.to_excel('results.xlsx')
В searchinfo подставляем нужное имя и вперёд. Результат сохранял в эксельку results.xlsx.
Креатив
Дальше решил сделать креатив. Нам необходимо найти проекты основателя. Имена проектов – это имена собственные и пишутся с заглавной буквы. Предположим и это похоже на правду, что с заглавной буквы в каждом твитте будут написаны: 1) имя основателя, 2) имя его проекта, 3) первое слово твитта и 4) посторонние слова. Слова 1 и 2 будут в твиттах встречаться часто, а 3 и 4 редко, по частотности мы 3 и 4 и отсеем. Да, ещё выяснилось, что в твиттах часто попадаются ссылки, 5) их тоже уберём.
Получилось так:
import re import nltk nltk.download('stopwords') from nltk.corpus import stopwords from nltk.stem.porter import PorterStemmer corpus = [] for i in range(0, len(results.index)): review1 = [] mystr = results['text'][i] #убрать 1)имя кого ищем и 2)его имя в тэге mystr = re.sub(searchinfo, ' ', mystr) searchinfo1 = searchinfo.replace(" ","_") mystr = re.sub(searchinfo1, ' ', mystr) #убрать 3)ссылки splitted_text = mystr.split() mystr="" for word in splitted_text: #первые 7 символов if len(word)>6: if word.find('https:/')==-1 and word.find('http://')==-1: mystr = mystr+' '+word else: mystr = mystr+' '+word review = re.sub('[^a-zA-Z]', ' ', mystr) review = review.split() for word in review: if word[0].isupper(): review1.append(word.lower()) ps = PorterStemmer() review1 = [ps.stem(word) for word in review1 if not word in set(stopwords.words('english'))] review1 = ' '.join(review1) corpus.append(review1) from sklearn.feature_extraction.text import CountVectorizer cv = CountVectorizer() X = cv.fit_transform(corpus).toarray() names = cv.get_feature_names()
Анализ данных креатива
В переменной names у нас лежат слова, а в переменной X – места их упоминания. «Сворачиваем» таблицу Х – получаем количество упоминаний. Удаляем слова, которые упоминаются редко. Сохраняем в Эксель. И в Экселе делаем красивую столбчатую диаграмму с информацией как часто какие слова в каком запросе упоминаются.
Наши супер ICO звёзды это «Le Minh Tam» и «Mike Novogratz». Графики:

Видно, что Le Minh Tam имеет отношение к «ceo, crypto, mine, sky». И немного к «disappear, fund, million».

Видно, что Mike Novogratz имеет отношение к «bank, bitcoin, crypto, digit, galaxy».
Данные из Х можно залить в нейронную сеть и она научиться определять всякое, а можно:
Анализ данных
И тут мы перестаём маяться дурью креативить и начинаем использовать python библиотеку TextBlob. Библиотека чудо как хороша.
Умные люди говорят, что она умеет:
- выделять фразы,
- делать частеречную разметку,
- анализировать настроения (это нам пригодиться ниже),
- делать классификацию (наивный байес, дерево решений),
- переводить и определять язык используя Google Translate,
- делать токенизацию (разбивать текста на слова и предложения),
- выявлять частоты слов и фраз,
- делать парсинг,
- выявлять n-граммы,
- делать\выявлять inflection\склонение\спряжение слов (плюрализацию и сингуляризацию) и лемматизацию,
- корректировать орфографию.
Библиотека позволяет добавить новые модели или языки через расширения и имеет интеграция WordNet. Одним словом, NLP вундервафля.
Мы выше сохраняли результаты поиска в файл results.xlsx. Загружаем его и проходимся по нему библиотекой TextBlob для целей оценки настроения:
from textblob import TextBlob results = pd.read_excel('results.xlsx') polarity = 0 for i in range(0, len(results.index)): polarity += TextBlob(results['text'][i]).sentiment.polarity print(polarity/i)
Классно! Пара строк кода и бах результат.
Обзор результатов
Получается, что на момент начала августа 2018 года найденные по запросу «Le Minh Tam» твитты показывают что-то такое, что негативно отразилось в твиттах со средней оценкой по всем твиттам минус 0.13. Если мы посмотрим сами твитты – то увидим например «Crypto Mining CEO Said to Disappear With $35 Million In Funds Crypto mining firm Sky Mining’s CEO Le Minh Tam has r…».
А товарищ «Mike Novogratz» сделал что-то такое, что положительно отразилось в твиттах со средней оценкой по всем твиттам плюс 0.03. Можно интерпретировать это так, что всё спокойно движется вперёд.
План атаки
Для целей оценки ICO стоит мониторить информацию по основателям ICO и по самому ICO из нескольких источников. Например:
- твиттер,
- соцсети,
- https://forklog.com/ — новости с обзорами,
- https://bitcointalk.org/ — форум, календарь и аналитика, рейтинги,
- https://cointelegraph.com/,
- https://icorating.com/,
- https://www.coinschedule.com/,
- https://icotracker.net/.
Делать это необходимо на постоянной основе, например ежечасно.
План для мониторинга одного ICO:
- Создаём список имён основателей ICO и самого ICO,
- Создаём список ресурсов для мониторинга,
- Делаем робота, который собирает данные по каждой строке из 1 — по каждому ресурсу из 2, пример выше,
- Делаем робота, который даёт оценку каждого 3, пример выше,
- Сохраняем результаты 4 (и 3),
- Повторяем пункты 3-5 ежечасно, автоматизированным образом, результаты оценки можно куда-то постить\посылать\сохранять,
- Автоматизировано следим за скачками оценки в пункте 6. Если происходят скачки оценки в пункте 6 – это повод провести дополнительное изучение происходящего экспертным образом. И поднять панику или наоборот порадоваться.
Ну вот как-то так.
P.S. Ну или покупаем эту информацию, например здесь thomsonreuters
ссылка на оригинал статьи https://habr.com/post/424465/
Добавить комментарий