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

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

Есть четкое понимание, что большая часть 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 – это повод провести дополнительное изучение происходящего экспертным образом. И поднять панику или наоборот порадоваться.

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


Оригинал статьи

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

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

Есть четкое понимание, что большая часть 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 – это повод провести дополнительное изучение происходящего экспертным образом. И поднять панику или наоборот порадоваться.

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


Оригинал статьи