ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ ΠΑΡΑΤΗΡΗΣΗ ΚΥΤΤΑΡΩΝ ΣΤΟ ΜΙΚΡΟΣΚΟΠΙΟ.docx
Nikolaos Oikonomou
1. Σημασιολογική Ανάλυση Κώδικα από Διαδικτυακές Πηγές με
Σκοπό την Επαναχρησιμοποίηση Λογισμικού
Αριστοτέλειο Πανεπιστήμιο Θεσσαλονίκης
Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών
Οικονόμου Νικόλαος (Α.Ε.Μ. 7742)
Επιβλέπων: Ανδρέας Συμεωνίδης, Καθηγητής
Συνεπιβλέπων: Θεμιστοκλής Διαμαντόπουλος, Υποψήφιος Διδάκτορας
Θεσσαλονίκη, 2 Ιουλίου 2018
3. Σκοπός της Διπλωματικής
• Τα σημερινά έργα λογισμικού είναι πολύπλοκα και μεγάλα σε μέγεθος
• Πλήθος επιλογών (APIs, βιβλιοθήκες, frameworks, πλατφόρμες κ.λπ.)
• Ελλιπής ή δυσκολονόητη τεκμηρίωση
Πρόβλημα: Δαπάνη χρόνου για την αναζήτηση και την κατανόηση χρήσιμων παραδειγμάτων κώδικα
χρησιμοποιώντας τις συμβατικές μηχανές αναζήτησης.
Σκοπός Διπλωματικής: Αυτοματοποίηση της διαδικασίας ανεύρεσης παραδειγμάτων κώδικα για ερωτήματα
του προγραμματιστή, με τη χρήση ενός Συστήματος Προτάσεων στην Τεχνολογία Λογισμικού
(Recommendation System in Software Engineering ή RSSE)
Θεσσαλονίκη, Ιούλιος 2018 StackSearch RSSE 3/35
4. RSSEs στη Βιβλιογραφία
Αδυναμίες υπαρχόντων συστημάτων
• Δε δέχονται ερωτήματα σε φυσική γλώσσα (περίπλοκη δομή ερωτημάτων)
• Δε γίνεται εκμετάλλευση της διαθέσιμης πληροφορίας (κείμενο που συνοδεύει τμήματα κώδικα)
• Αδύναμοι μηχανισμοί κατάταξης
• Δεν προτείνονται έτοιμα τμήματα κώδικα (ακολουθίες APIs, συμπλήρωση κώδικα κ.λπ.)
Θεσσαλονίκη, Ιούλιος 2018 StackSearch RSSE 4/35
11. Corpus Builder – Μορφή Αναρτήσεων (Posts)
• Μετατροπή html μορφής σε κείμενο
• Εξαγωγή ακολουθιών από τα τμήματα κώδικα
• Αξιολόγηση και επιλογή ποιοτικών αναρτήσεων
• Τελική επεξεργασία κειμένου
Θεσσαλονίκη, Ιούλιος 2018 StackSearch RSSE 11/35
12. Corpus Builder – Επιλογή Αναρτήσεων
LSTM Ταξινομητής για αναρτήσεις με θόρυβο:
• 1 layer LSTM
• 1 layer CNN
• Εκπαίδευση σε 2500 κατηγοριοποιημένα post
• Accuracy > 92% στο σετ δεδομένων
Θεσσαλονίκη, Ιούλιος 2018 StackSearch RSSE 12/35
Μετρικές χρήσιμων αναρτήσεων:
• Μέγεθος γραμμής < 1000 χαρακτήρες
• Λόγος
# 𝜆𝜀𝜉𝜀𝜔𝜈
# 𝜎𝜂𝜇𝜀𝜄𝜔𝜈 𝜎𝜏𝜄𝜉𝜂𝜍
> 1.6
1η Παρατήρηση
Αναρτήσεις με μεγάλο αριθμό σημείων στίξης περιέχουν
μη χρήσιμες πληροφορίες.
2η Παρατήρηση
Αναρτήσεις με debug logs και κώδικα σε άλλες γλώσσες
(html, javascript κ.λπ.) αποτελούν θόρυβο για το corpus
εκπαίδευσης.
13. Corpus Builder – Επεξεργασία Κειμένου
Κατακερματισμός κειμένου με custom
tokenizer
• Διατήρηση όρων API
• Διατήρηση τελεστών της Java (π.χ. ==, !=, >=)
• Αφαίρεση σημείων στίξης
• Αφαίρεση συμβόλων, αριθμών και URLs
Κανονικοποίηση όρων κειμένου
• Ανάπτυξη συντομογραφιών
• Αντικατάσταση αριθμών με λέξεις
Στόχοι
• Ομοιομορφία κειμένου
• Μείωση του συνόλου των όρων (λεξικό όρων)
Θεσσαλονίκη, Ιούλιος 2018 StackSearch RSSE 13/35
Original Tokenized Normalized
10 10 ten
don’t do n’t do not
that’s that ‘s that is
U.K. U.K. U.K.
properties/fields properties / fields properties fields
Java/C++ Java / C++ Java C++
(active) ( active ) active
java.io* java.io java.io
System.out.println() System.out.println System.out.println
14. Corpus Builder – Χρήση RegEx
Χρήση κανονικών εκφράσεων για την τελική επεξεργασία του κειμένου
• Αφαίρεση σημείων στίξης που έχουν μείνει
• Αφαίρεση κοινότυπων Java stack traces ή debug logs
• Αφαίρεση μεγάλων ονομάτων πακέτων ή άλλων string
• Συμπίεση κενών χαρακτήρων
Θεσσαλονίκη, Ιούλιος 2018 StackSearch RSSE 14/35
18. Index Builder – Πίνακας Διανυσματικών Αναπαραστάσεων των Αναρτήσεων
Περιγραφή των αναρτήσεων (posts) με τρεις αναπαραστάσεις
• Διανύσματα των τίτλων (TitleVectors)
• Διανύσματα των σωμάτων (BodyVectors)
• Διανύσματα των ακολουθιών των tags (TagVectors)
Θεσσαλονίκη, Ιούλιος 2018 StackSearch RSSE 18/35
19. Index Builder – Ευρετήριο Μεταδεδομένων των Αναρτήσεων
Θεσσαλονίκη, Ιούλιος 2018 StackSearch RSSE 19/35
• Μορφή JSON
• Πληροφορίες ανάρτησης
• Σχετικές οντότητες
• Τμήματα κώδικα
21. Search Engine – Ερώτημα
• Διατύπωση ερωτήματος σε φυσική γλώσσα
• Αφαίρεση σημείων στίξης
• Κανονικοποίηση ερωτήματος (όπως πριν)
• Δημιουργία διανυσματικής αναπαράστασης ερωτήματος (FastText ή TF-IDF)
Θεσσαλονίκη, Ιούλιος 2018 StackSearch RSSE 21/35
22. Search Engine – Μηχανισμός Κατάταξης
Σενάριο μεμονομένου μοντέλου (FastText ή TF-IDF)
• Κατάταξη με βάση την ομοιότητα συνημιτόνου
• Σύγκριση διανυσμάτων ερωτήματος και αναρτήσεων (Πίνακα Διανυσματικών Αναπαραστάσεων)
• Κάθε ανάρτηση έχει τρεις διανυσματικές αναπαραστάσεις (Τίτλος, Σώμα, Tags)
• Υπολογισμός ομοιοτήτων ως:
𝑠𝑖𝑚(𝑞, 𝑑) =
𝑖=1
3
𝑤𝑖 𝑐𝑜𝑠𝑠𝑖𝑚(𝑄, 𝑓𝑖)
Σενάριο υβριδικού μοντέλου (FastText και TF-IDF)
• Συνδυασμός ομοιοτήτων των επιμέρους μοντέλων (FastText, TF-IDF)
• Υπολογισμός ομοιοτήτων ως:
ℎ𝑦𝑏𝑟𝑖𝑑_𝑠𝑖𝑚(𝑞, 𝑑) = 𝑤𝑓𝑡 · 𝑓𝑡_𝑠𝑖𝑚(𝑞, 𝑑) + 𝑤𝑡𝑓𝑖𝑑𝑓 · 𝑡𝑓𝑖𝑑𝑓_𝑠𝑖𝑚(𝑞, 𝑑)
Θεσσαλονίκη, Ιούλιος 2018 StackSearch RSSE 22/35
23. Search Engine – Presenter
• Διεπαφή τύπου Command Line Input (CLI)
• Παρουσίαση των παραδειγμάτων κώδικα μέσω της διεπαφής
• Παρουσίαση επιπλέον πληροφοριών από τον πίνακα μεταδεδομένων
• σύνδεσμος της ανάρτησης-απάντησης (απ’ όπου έγινε η εξαγωγή του κώδικα)
• τίτλος της ανάρτησης-ερώτησης
• βαθμολογία της ανάρτησης
• οντότητες που περιγράφουν το ερώτημα
Θεσσαλονίκη, Ιούλιος 2018 StackSearch RSSE 23/35
24. Αξιολόγηση Συστήματος – Πείραμα 1ο
• Συλλογή ρεαλιστικών ερωτημάτων για την
εκτέλεση του πρώτου πειράματος
• Χρήση ερωτημάτων ίδιου περιεχομένου με
διαφορετική διατύπωση
• Ομαδοποίηση ερωτημάτων βάσει περιεχομένου
Θεσσαλονίκη, Ιούλιος 2018 StackSearch RSSE 24/35
Index Query Group
1 How to read a comma separated file? 1
2 How to read a CSV file? 1
3 How to read a delimited file? 1
4 How to read input from console? 2
5 How to read input from terminal? 2
6 How to read input from command prompt? 2
7 How to play an mp3 file? 3
8 How to play an audio file? 3
9 How to compare dates? 4
10 How to compare time strings? 4
11 How to dynamically load a class? 5
12 How to load a jar/class at runtime? 5
13 How to calculate checksums for files? 6
14 How to calculate MD5 checksum for files? 6
15 How to iterate through a hashmap? 7
16 How to loop over a hashmap? 7
17 How to split a string? 8
18 How to handle an exception? 9
25. Πείραμα 1ο – Ποιοτική Αξιολόγηση
• Μετρικές όπως το precision και το recall δεν είναι εύκολα εφαρμόσιμες.
• Θέλουμε να λαμβάνεται υπόψιν και η σειρά με την οποία εμφανίζονται τα χρήσιμα αποτελέσματα.
Θεσσαλονίκη, Ιούλιος 2018 StackSearch RSSE 25/35
Average Precision
Το Average Precision ισούται με:
𝐴𝑣𝑒𝑃 =
0
1
𝑝(𝑟)𝑑𝑟 =
𝑘=1
𝑛
𝑃(𝑘)𝛥𝑟(𝑘) =
𝑘=1
𝑛
(𝑃(𝑘) · 𝑟𝑒𝑙(𝑘))
𝑛𝑢𝑚𝑏𝑒𝑟 𝑜𝑓 𝑟𝑒𝑙𝑒𝑣𝑎𝑛𝑡 𝑑𝑜𝑐𝑢𝑚𝑒𝑛𝑡𝑠
Mean Average Precision
Αν Q το πλήθος των ερωτημάτων, τότε το Mean Average Precision ισούται με:
𝑀𝐴𝑃 =
𝑞=1
𝑄
𝐴𝑣𝑒𝑃(𝑞)
𝑄
Mean Search Length
Ως μήκος αναζήτησης SL ορίζεται το πλήθος των μη σχετικών αποτελεσμάτων που εμφανίζονται στο χρήστη μέχρι να
εμφανιστούν N σχετικά.
Για ένα πλήθος ερωτημάτων Q το μέσο μήκος αναζήτησης MSL ισούται με:
𝑀𝑆𝐿 =
𝑞=1
𝑄
𝑆𝐿(𝑞)
𝑄
29. Πείραμα 2ο – Ποσοτική Αξιολόγηση με PostLinks
PostLinks ή Σύνδεσμοι Αναρτήσεων
• Ζεύγη αναγνωριστικών αναρτήσεων (PostId – PostId)
• Τύπος PostLink (συνδεδεμένη ή διπλότυπη ανάρτηση)
• Τα PostLinks υποδεικνύουν σχετικές αναρτήσεις
Βήματα Πειράματος
1. Περιορισμός του σετ δεδομένων
• Αναρτήσεις με τουλάχιστον ένα snippet
• Αναρτήσεις με σκορ > -3
• Αναρτήσεις με AcceptedAnswer
2. Χρήση των τίτλων σαν ερωτήματα
3. Για κάθε ερώτημα/τίτλο γίνεται λήψη των πρώτων 20 αποτελεσμάτων από το σύστημα
4. Για κάθε ερώτημα/τίτλο γίνεται σχηματισμός όλων των ζευγών αναγνωριστικών (ερώτημα – αποτέλεσμα)
5. Υπολογισμός ποσοστού των ζευγών που βρίσκονται στη λίστα των PostLinks
Θεσσαλονίκη, Ιούλιος 2018 StackSearch RSSE 28/35
31. Συμπεράσματα
• Εξοικονόμηση χρόνου χρησιμοποιώντας το RSSE και παρουσιάζοντας παραδείγματα
κώδικα με ορθή σύνταξη
• Η καλή προεπεξεργασία του κειμένου παράγει ποιοτικότερα μοντέλα διανυσματικού
χώρου (VSMs)
• Η χρήση του μοντέλου FastText εξάγει χρήσιμη σημασιολογική πληροφορία
• Ο συνδυασμός των δύο μοντέλων (TF-IDF, FastText) καταφέρνει καλύτερα αποτελέσματα
Θεσσαλονίκη, Ιούλιος 2018 StackSearch RSSE 31/35
32. Μελλοντική Εργασία
• Γραφικό Περιβάλλον (GUI) σε ιστοσελίδα
• Ρύθμιση βαρών του μηχανισμού κατάταξης
• Συμπίεση ευρετηρίων/πινάκων αναζήτησης διανυσμάτων
• Υποστήριξη και άλλων γλωσσών προγραμματισμού (C/C++, Python, Scala)
Θεσσαλονίκη, Ιούλιος 2018 StackSearch RSSE 32/35
34. Ευχαριστίες
Οφείλω ένα μεγάλο ευχαριστώ:
• στον κ. Ανδρέα Συμεωνίδη για την ευκαιρία που μου έδωσε να ασχοληθώ με
το αντικείμενο της διπλωματικής.
• στο Θέμη Διαμαντόπουλο για τη συνεχή στήριξη και καθοδήγηση που μου
παρείχε.
• σε εσάς για την προσοχή σας.
Θεσσαλονίκη, Ιούλιος 2018 StackSearch RSSE 34/35