Monday, April 29, 2024
HomeRuby On RailsDetect Spam with AI | Drifting Ruby

Detect Spam with AI | Drifting Ruby


# Terminal
python net.py
# necessities.txt
torch
transformers
flask
gunicorn
# net.py
from flask import Flask, request
import detector as detector
app = Flask(__name__)

@app.route('/verify', strategies=["POST"])
def handle_request():
  immediate = request.type.get("immediate")
  if not immediate:
    return { "error": "immediate parameter is required" }, 400
  detection = detector.detect(immediate)
  return { "spam": bool(detection)}

app.run(host="0.0.0.0", port=8000)
# detector.py
import torch
from transformers import RobertaTokenizer, RobertaForSequenceClassification

if torch.cuda.is_available():
  print("USING CUDA")
  gadget = torch.gadget("cuda")
elif torch.backends.mps.is_available():
  print("USING Apple Steel")
  gadget = torch.gadget("mps")
else:
  print("USING CPU")
  gadget = torch.gadget("cpu")

model_path = "mshenoda/roberta-spam"
tokenizer = RobertaTokenizer.from_pretrained(model_path)
mannequin = RobertaForSequenceClassification.from_pretrained(model_path, num_labels=2).to(gadget)

def detect(textual content):
  inputs = tokenizer(textual content, return_tensors="pt", padding="max_length", truncation=True, max_length=512)
  inputs = {okay: v.to(gadget) for okay,v in inputs.objects()}

  with torch.no_grad():
    outputs = mannequin(**inputs)

  return torch.argmax(outputs.logits, dim=1)
# Dockerfile
FROM python:3.11.6

RUN apt replace && apt improve -y

WORKDIR /app
COPY . /app
RUN pip set up --no-cache-dir -r necessities.txt

ENV NVIDIA_VISIBLE_DEVICES=all
ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility

EXPOSE 5000

CMD ["gunicorn -w 2 -b 0.0.0.0:5000 web:app"]
# docker-compose.yml
model: '3.8'

providers:
  app:
    # picture: USERNAME/IMAGE:newest
    command: gunicorn -w 2 -b 0.0.0.0:5000 net:app
    ports:
      - 5000:5000
    setting:
      - NVIDIA_VISIBLE_DEVICES=all
      - NVIDIA_DRIVER_CAPABILITIES=compute,utility
    deploy:
      assets:
        reservations:
          units:
            - capabilities: [gpu]
    volumes:
      - /root/model-cache:/root/.cache
# Terminal
rails g migration add_spam_fields_to_comments spam:boolean spam_checked_on:datetime
rails g job CheckForSpam
# db/migrate/20231105020507_add_spam_fields_to_comments.rb
class AddSpamFieldsToComments < ActiveRecord::Migration[7.1]
  def change
    add_column :feedback, :spam, :boolean, default: false
    add_column :feedback, :spam_checked_on, :datetime
  finish
finish
# app/fashions/remark.rb
class Remark < ApplicationRecord
  has_rich_text :content material
  belongs_to :submit
  broadcasts_to :submit

  # after_create_commit -> { broadcast_append_to submit }
  after_create_commit -> { CheckForSpamJob.perform_later self }
  # after_update_commit -> { broadcast_replace_to submit }
  # after_destroy_commit -> { broadcast_remove_to submit }
finish
# app/jobs/check_for_spam_job.rb
require "web/http"
require "uri"
require "json"

class CheckForSpamJob < ApplicationJob
  queue_as :default

  def carry out(remark)
    immediate = remark.content material.to_plain_text
    uri = URI.parse("http://127.0.0.1:8000/verify")
    http = Web::HTTP.new(uri.host, uri.port)
    http.use_ssl = true if uri.scheme == "https"
    http.open_timeout = 10
    http.read_timeout = 10
    request = Web::HTTP::Publish.new(uri.request_uri)
    request.set_form_data({ immediate: immediate })
    response = http.request(request)
    consequence = JSON.parse(response.physique)

    if outlined?(consequence["spam"])
      # remark.replace(spam_checked_on: Time.now, spam: consequence["spam"])
      remark.destroy if consequence["spam"]
    else
      # retry
    finish

  rescue StandardError => e
    # retry
  finish
finish
# app/views/feedback/_comment.html.erb
<%= turbo_frame_tag dom_id(remark), class: "card my-3 shadow-sm" do %>
  <%= content_tag :div, class: "card-header #{remark.spam? ? "bg-danger" : "bg-primary"} text-white" do %>
    <div class="">
      Commented on <%= remark.updated_at.strftime("%B %d, %Y at %l:%M %p") %>
    </div>
  <% finish %>
  <%= content_tag :div, class: "card-body #{remark.spam? ? "bg-danger-subtle" : "bg-primary-subtle"}" do %>
    <p class="card-text"><%= remark.content material %></p>
  <% finish %>
  <div class="card-footer bg-transparent">
    <%= link_to "Edit", [:edit, comment.post, comment], class: 'btn btn-outline-secondary btn-sm me-2' %>
    <%= link_to "Delete", [comment.post, comment], "data-turbo-method": :delete, "data-turbo-confirm": "Are you positive?", class: 'btn btn-outline-danger btn-sm' %>
  </div>
<% finish %>
# app/controllers/comments_controller.rb
def index
  # @feedback = @submit.feedback.order(updated_at: :asc)
  @feedback = @submit.feedback.the place(spam: false).order(updated_at: :asc)
finish
RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments