Рубрики
Без рубрики

Строительство фронта – часть III (анализ настроений в твиттере)

Это последняя статья сериала Live Tweet Analysis. В предыдущей статье мы … с меткой Python, Docker.

Анализ настроений живого твита (3 серии деталей)

Это последняя статья серии Живой твит Анализ настроений Анкет В предыдущей статье мы увидели, как создать API, чтобы служить нашим прогнозам. Эта статья будет посвящена тому, как построить фронт.

Обычно фронтаризации написаны в ReactJS или VueJS (это единственные, которые я знаю). Но я большой поклонник Python, и я хотел бы построить фронт с помощью Python. Streamlit Помогает быстро построить интерфейс для обслуживания ваших приложений для машинного обучения.

Несмотря на то, что бэкэнд здесь не нужен (также можно было бы справиться с частью прогнозирования), важно перенести задачу тяжелой работы на бэкэнд, который может породить нескольких работников ( стреляющий вместо Uvicorn ) и реализовать лучшие методы работы и асинхронные методы.

Строительство фронта

Убедитесь, что вы находитесь в каталоге Frontend

Потоковая передача хэштегов

# tweets.py

import tweepy as tw

auth = tw.OAuthHandler(config.consumer_key, config.consumer_secret)
auth.set_access_token(config.access_token, config.access_token_secret)
api = tw.API(auth, wait_on_rate_limit=True)

tweets = tw.Cursor(api.search, q=hashtag, lang="en", since=date).items()

твиты Object будет держать поток твитов, извлеченных из Twitter с даты.

Построение пользовательского интерфейса

# tweets.py

import streamlit as st

st.title("Twitter Live Sentiment Visualizer (beta)")

# design the sibar elements
st.sidebar.title("Enter a hashtag")
hashtag = st.sidebar.text_input("hashtag", "trump")
date = st.sidebar.date_input("Analyse tweets from", datetime.date(2020, 8, 1))

# if "Live analysis" is clicked
if st.sidebar.button("Live analysis", key="analyse"):
    pos_count = 0
    neg_count = 0
    tweets_count = 0

    st.subheader(f"Analysing #{hashtag} from {date}")
    d = {"Positive": [pos_count], "Negative": [neg_count]}
    df = pd.DataFrame(data=d)

    hashtag = f"#{hashtag}"

    # get the tweets
    with st.spinner("Getting tweets..."):
        tweets = tw.Cursor(api.search, q=hashtag, lang="en", since=date).items()

    total_tweets = st.empty()
    pos_tweets = st.empty()
    neg_tweets = st.empty()

    sentiments = ["Positive", "Negative"]
    chart = st.line_chart(df)

    # iterate through all the tweets
    for idx, tweet in enumerate(tweets):
        tweets_count += 1
        output = requests.post("http://backend:8000/api", json={"tweet": tweet.text})
        output = output.content.decode("utf8")
        output = json.loads(output).get("sentiment")

        # count the number of each sentiment
        if output == "Negative":
            neg_count += 1
        elif output == "Positive":
            pos_count += 1

        total_tweets.text("Tweets Analysed: %d" % tweets_count)
        pos_tweets.text("Positive tweets: %d" % pos_count)
        neg_tweets.text("Negative tweets: %d" % neg_count)

        # update the DataFrame
        df2 = pd.DataFrame({"Positive": [pos_count], "Negative": [neg_count]})
        df.update(df2)
        # draw the cumulative chart
        chart.add_rows(df)

    if neg_count == 0 and pos_count == 0:
        st.warning(f"No Tweets Found on {hashtag}")
    else:
        st.success("Tweets classified")

По сути, это получает твиты из API Twitter, отправьте его на бэкэнд для вывода и настаивайте на совокупности каждого чувства. Вы могли бы даже изменить это на Семь твитов скользящих средней 😉. Одна важная вещь, которую нужно заметить, это то, что

output = requests.post("http://backend:8000/api", json={"tweet": tweet.text})

Мы использовали Бэкэнд: 8000 вместо Localhost: 8000 . Это потому, что сервис, который мы создаем для бэкэнда, будет называться Бэкэнд и хозяин будет Бэкэнд вместо Localhost

Зайдите на фронт

FROM python:3.8-slim

WORKDIR /app

COPY requirements.txt .

RUN pip install -r requirements.txt

EXPOSE 8501

COPY . .

CMD ["streamlit", "run", "tweets.py"]

# nothing fancy here

Теперь давайте свяжем все, чтобы построить наше приложение

CD .. Чтобы вернуться к корневому каталогу. Структура вашего проекта должна выглядеть так.

❯ tree .
.
├── LICENSE
├── README.md
├── backend
│   ├── Dockerfile
│   ├── classify.py
│   ├── models
│   │   └── sentiment_model.pickle
│   ├── requirements.txt
│   ├── server.py
│   └── utils.py
├── docker-compose.yml
└── frontend
    ├── Dockerfile
    ├── config.py
    ├── requirements.txt
    └── tweets.py

Докер-состав

Создать Docker-compose.yml в корневом каталоге

version: "3"
services:
  frontend:
    build: frontend
    ports:
      - "8501:8501"
    depends_on:
      - backend

  backend:
    build: backend
    ports:
      - "8000:8000"
  • Версия: Составьте файл версии 3
  • Услуги: Здесь мы определяем услуги (Frontend и Backend)
  • Зависит_он: Поскольку фронтэнд зависит от бэкэнда
❯ docker-compose build
❯ docker-compose up -d
Starting sentwitter_backend_1 ... done
Starting sentwitter_frontend_1 ... done
# -d for detach mode (it'll run in background)

Перейдите к Localhost: 8501 И вы должны увидеть, как ваше приложение работает. Давайте быстро забежать #2Articles1week Анкет

Это много красных флагов прямо для модели. Никто не будет писать негативно о 2Articles1week Анкет Это просто модель такая плохая.

Ссылка

Анализ настроений живого твита (3 серии деталей)

Оригинал: “https://dev.to/amal/building-the-frontend-part-iii-live-tweet-sentiment-analysis-315b”