Друзья, добрый день.
Есть четкое понимание, что большая часть 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 = "vvvvEXQWhuF1fhAqAtoXRrrrr"
API_SECRET = "vvvv30kspvqiezyPc26JafhRjRiZH3K12SGNgT0Ndsqu17rrrr"
ACCESS_TOKEN = "vvvv712098-WBn6rZR4lXsnZCwcuU0aOsRkENSGpw2lppArrrr"
ACCESS_TOKEN_SECRET = "vvvvlG7APRc5yGiWY5xFKfIGpqkHnXAvuwwVzMwyyrrrr"
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».
Данные из Х можно залить в нейронную сеть и она научиться определять всякое, а можно:
Анализ данных
И тут мы перестаём маяться дурью креативить и начинаем использовать 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://icotracker.net/.
Делать это необходимо на постоянной основе, например ежечасно.
План для мониторинга одного ICO:
- Создаём список имён основателей ICO и самого ICO,
- Создаём список ресурсов для мониторинга,
- Делаем робота, который собирает данные по каждой строке из 1 — по каждому ресурсу из 2, пример выше,
- Делаем робота, который даёт оценку каждого 3, пример выше,
- Сохраняем результаты 4 (и 3),
- Повторяем пункты 3-5 ежечасно, автоматизированным образом, результаты оценки можно куда-то постить\посылать\сохранять,
- Автоматизировано следим за скачками оценки в пункте 6. Если происходят скачки оценки в пункте 6 – это повод провести дополнительное изучение происходящего экспертным образом. И поднять панику или наоборот порадоваться.
Ну вот как-то так.