Преглед изворни кода

Added facebook prediction and fixes all facebook-reply related bugs

Mohidul Islam пре 4 година
родитељ
комит
efc606a1e9

+ 1 - 0
dashboard/templates/base.html

@@ -25,6 +25,7 @@
           <div class="collapse navbar-collapse" id="navbarToggle">
             <div class="navbar-nav mr-auto">
               <a class="nav-item nav-link" href="{% url 'review-list' %}">All Reviews</a>
+              <a class="nav-item nav-link" href="{% url 'facebook-reviews' %}">FaceBook</a>
             </div>
             <!-- Navbar Right Side -->
             <div class="navbar-nav">

+ 6 - 2
facebook_app/review_utils.py

@@ -106,7 +106,7 @@ def populate_facebook_reviews():
 
 def reply2facebook_review(review_id, reply, like=False, love=False):
     # switch to mobile view which not support any JavaScript
-    base_url = 'https://m.facebook.com/'
+    base_url = 'https://mbasic.facebook.com/'
     url = base_url + str(review_id)
     browser.get(url)
 
@@ -114,19 +114,23 @@ def reply2facebook_review(review_id, reply, like=False, love=False):
     if like:
         like_btn = browser.find_element_by_xpath(
             '/html/body/div/div/div[2]/div/div[1]/div[2]/div/div[1]/table/tbody/tr/td[1]/a')
+        assert like_btn.text == 'Like'
         like_btn.click()
 
     # love the review if needed
     if love:
         react_btn = browser.find_element_by_xpath(
             '/html/body/div/div/div[2]/div/div[1]/div[2]/div/div[1]/table/tbody/tr/td[2]/a')
+        assert react_btn.text == 'React'
         react_btn.click()
         love_btn = browser.find_element_by_xpath(
             '/html/body/div/div/div[2]/div/table/tbody/tr/td/ul/li[2]/table/tbody/tr/td/a/div/table/tbody/tr/td[2]')
+        assert love_btn.text == 'Love'
         love_btn.click()
 
     # reply the review
-    reply_field = browser.find_element_by_xpath('//*[@id="composerInput"]')
+    reply_field = browser.find_element_by_id('composerInput')
+    assert reply_field.get_attribute('name') == 'comment_text'
     reply_field.send_keys(reply)
     ins = browser.find_elements_by_tag_name('input')
     for x in ins:

+ 3 - 3
facebook_app/templates/facebook-reviews.html

@@ -23,9 +23,9 @@
                 {{ form|crispy }}
             <input type="hidden" value="{{ review.id }}" name="review_id">
             <input class="btn btn-primary ml-2" style="float: right" type="submit", value="Submit"/>
-<!--            {% if review.review_text%}-->
-<!--                <a href="{% url 'predict' review.id %}" class="btn btn-info">Analyze</a>-->
-<!--            {% endif %}-->
+            {% if review.review_text%}
+                <a href="{% url 'facebook-reviews-prediction' review.id %}" class="btn btn-info">Analyze</a>
+            {% endif %}
         </form>
         </div>
 

+ 2 - 1
facebook_app/urls.py

@@ -1,6 +1,7 @@
 from django.urls import path
-from .views import FacebookReviews
+from .views import FacebookReviews, FacebookReviewPrediction
 
 urlpatterns = [
     path('', FacebookReviews.as_view(), name='facebook-reviews'),
+    path('prediction/<id>', FacebookReviewPrediction.as_view(), name='facebook-reviews-prediction'),
 ]

+ 45 - 2
facebook_app/views.py

@@ -6,10 +6,13 @@ from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
 from django.contrib.auth.mixins import LoginRequiredMixin
 from django.utils import timezone
 
+from nlu_job.nlu_utils import model_inference, analyze_model_inference, clean_text
+
 from .models import FacebookReview, FacebookReviewReply
 from .forms import ReplyForm
-
+from review.models import CustomReply
 from .review_utils import reply2facebook_review
+from nlu_job.nlu_utils import filter_with_last_ten_reviews
 
 
 class FacebookReviews(LoginRequiredMixin, View):
@@ -24,7 +27,7 @@ class FacebookReviews(LoginRequiredMixin, View):
         reply2facebook_review(
             review_id=review_id,
             reply=replied_text,
-            love=True
+            like=True
         )
 
         FacebookReviewReply.objects.create(
@@ -56,3 +59,43 @@ class FacebookReviews(LoginRequiredMixin, View):
             reviews = paginator.page(paginator.num_pages)
         context = {'reviews': reviews, 'form': form}
         return render(request, 'facebook-reviews.html', context=context)
+
+
+class FacebookReviewPrediction(View):
+
+    def get(self, request, id,  *args, **kwargs):
+        review = FacebookReview.objects.get(pk=id)
+        review_text = clean_text(review.review_text)
+        res = model_inference(review_text)
+        intents = analyze_model_inference(res)
+        replies = {}
+        for intent in intents.keys():
+            r = CustomReply.objects.filter(reply_category=intent)
+            filtered_replies = filter_with_last_ten_reviews(review.page.location_id, r)
+            replies[intent] = filtered_replies
+
+        now = timezone.now()
+        form = ReplyForm()
+        date = now - timezone.timedelta(days=15)
+
+        reviews = FacebookReview.objects.filter(
+            facebookreviewreply=None,
+            create_time__gte=date
+        ).order_by('create_time')
+
+        page = request.GET.get('page', 1)
+        paginator = Paginator(reviews, 10)
+        try:
+            reviews = paginator.page(page)
+        except PageNotAnInteger:
+            reviews = paginator.page(1)
+        except EmptyPage:
+            reviews = paginator.page(paginator.num_pages)
+        context = {
+            'reviews': reviews,
+            'form': form,
+            'intents': intents,
+            'replies': replies,
+
+        }
+        return render(request, 'facebook-reviews.html', context=context)

+ 11 - 3
nlu_job/nlu_utils.py

@@ -5,16 +5,24 @@ from requests import post
 import json
 from difflib import SequenceMatcher
 from review.models import Review
+from facebook_app.models import FacebookReview
 
 nlu_server_url = getattr(settings, 'NLU_SERVER_URI')
 ner_model = getattr(settings, 'SPACY_NER_MODEL')
 
 
-def filter_with_last_ten_reviews(location_id, replies):
+def filter_with_last_ten_reviews(location_id, replies, platform='google'):
     replies = list(replies)
-    revs = Review.objects.filter(location_id=location_id).exclude(reply=None).order_by('-update_time')[:10]
+    if platform == 'google':
+        revs = Review.objects.filter(location_id=location_id).exclude(reply=None).order_by('-update_time')[:10]
+    elif platform == 'facebook':
+        revs = FacebookReview.objects.filter(page__location_id=location_id).\
+                   exclude(facebookreviewreply=None).order_by('create_time')[:10]
     for r in revs:
-        s1 = r.reply.replied_text
+        if platform == 'google':
+            s1 = r.reply.replied_text
+        elif platform == 'facebook':
+            s1 = r.facebookreviewreply.replied_text
         for rep in replies:
             s2 = rep.reply
             similarity = SequenceMatcher(None, s1, s2).ratio()