Как стать автором
Обновить

Блины с ICOй на питоне или как померять людей и проекты ICO

Время на прочтение5 мин
Количество просмотров1.5K

Друзья, добрый день.


Есть четкое понимание, что большая часть 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». Графики:


image


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


image


Видно, что Mike Novogratz имеет отношение к "bank, bitcoin, crypto, digit, galaxy".


Данные из Х можно залить в нейронную сеть и она научиться определять всякое, а можно:


Анализ данных


И тут мы перестаём маяться дурью креативить и начинаем использовать python библиотеку TextBlob. Библиотека чудо как хороша.


Умные люди говорят, что она умеет:


  1. выделять фразы,
  2. делать частеречную разметку,
  3. анализировать настроения (это нам пригодиться ниже),
  4. делать классификацию (наивный байес, дерево решений),
  5. переводить и определять язык используя Google Translate,
  6. делать токенизацию (разбивать текста на слова и предложения),
  7. выявлять частоты слов и фраз,
  8. делать парсинг,
  9. выявлять n-граммы,
  10. делать\выявлять inflection\склонение\спряжение слов (плюрализацию и сингуляризацию) и лемматизацию,
  11. корректировать орфографию.

Библиотека позволяет добавить новые модели или языки через расширения и имеет интеграция 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 из нескольких источников. Например:



План для мониторинга одного ICO:


  1. Создаём список имён основателей ICO и самого ICO,
  2. Создаём список ресурсов для мониторинга,
  3. Делаем робота, который собирает данные по каждой строке из 1 — по каждому ресурсу из 2, пример выше,
  4. Делаем робота, который даёт оценку каждого 3, пример выше,
  5. Сохраняем результаты 4 (и 3),
  6. Повторяем пункты 3-5 ежечасно, автоматизированным образом, результаты оценки можно куда-то постить\посылать\сохранять,
  7. Автоматизировано следим за скачками оценки в пункте 6. Если происходят скачки оценки в пункте 6 – это повод провести дополнительное изучение происходящего экспертным образом. И поднять панику или наоборот порадоваться.

Ну вот как-то так.


P.S. Ну или покупаем эту информацию, например здесь thomsonreuters

Теги:
Хабы:
Всего голосов 13: ↑6 и ↓7-1
Комментарии2

Публикации

Истории

Работа

Python разработчик
122 вакансии
Data Scientist
59 вакансий

Ближайшие события

Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург