• No results found

4.7.1 GORCh

Då frågorna och deras varianser tagits fram med hjälp av GORCh besvarade den samtliga korrekta frågor med ett tillfredställande svar och uteblev med svar i varianserna med stavfel, synonymer och referenser.

GORCh besvarade samtliga frågor med slumpmässig ordföljd och adderade känslofraser korrekt.

4.7.2 Människa

Människan kunde, utan att uttrycka några svårigheter, besvara samtliga frågor inom de korrekt ställda frågorna, de med stavfel, de med synonymer och de med adderade känslofraser.

För de frågorna med slumpmässig ordföljd gav människan ett korrekt svar på samtliga frågor utom en där osäkerheten blev så stor att han valde att avstå. Dock uttrycktes under flera av frågorna en osäkerhet kring kontext här.

För referensmeningarna avstod människan från sex av frågorna, här ställdes dock bara elva av tolv frågor på grund av ett misstag vid genereringen av fråge- formuläret. Referensmeningarna är dock främst framtagna för att kunna jämföra säkerhetspoängsfall i QnA Maker med fallen vid stavfel och referensmeningar, därför är detta av mindre vikt. Människans samtliga svar återfinns i bilagorna F.1, F.2, F.3, F.4, F.5 och F.6.

5

Analys

För att besvara frågeställningarna analyserades och jämfördes den insamlade datan. Analysen för samtliga frågeställningar byggde på en jämförelse mellan tester av QnA Maker, GORCh och människan. Resultaten för frågor ställda med varianser av frågetexten jämförs med resultaten för korrekta frågor.

För att göra jämförelsen används följande nyckeltal:

• Genomsnittlig säkerhet: Genomsnittlig säkerhetspoäng för samtliga frågor i kategorin.

• Antal korrekta: Antal korrekta svar i kategorin. • Antal > 50: Antal svar med en säkerhetspoäng över 50.

• Antal felaktiga > 50: Antal inkorrekta svar med en säkerhetspoäng över 50

5.1

Korrekta frågor

Nyckeltalen för de korrekta frågorna återfinns i Tabell 3 för jämförelse med nyckeltalen för övriga tester.

Tabell 3: Nyckeltal för korrekta frågor Genomsnittlig

säkerhet

Antal korrekta Antal >50 Antal felaktiga

>50

67, 84166667 11 9 1

Venndiagrammet i Figur 9 visar att både GORCh och människan svarade rätt på alla 12 korrekt ställda frågor. QnA Maker svarade fel på en fråga.

Figur 9: Venndiagram som visar antalet korrekta frågor, som GORCh, QnA Maker respektive mänsklig referens svarar rätt på

5.2

Frågor med felstavade ord

För att besvara frågeställningen ställdes frågor med felstavade nyckelord. Stav- felen togs fram med stöd av teorin som togs upp i Avsnitt 3.8 för att försöka få så verklighetstrogna stavfel som möjligt utan att samla in texter skrivna av slutan- vändare. Tabell 4 visar den genomsnittliga säkerhetspoängen som QnA Maker gav för frågor med stavfel. Den genomsnittliga säkerhetspoängen för frågorna i denna kategori hamnade i detta experiment på ∼ 33, 0517.

Tabell 4: Nyckeltal för felstavade frågor Genomsnittlig

säkerhet

Antal korrekta Antal >50 Antal felaktiga

>50

33, 05166667 10 3 1

Jämfört med resultatet för de korrekta frågorna gav QnA Maker fortfarande fel svar på fråga 11, men säkerhetspoängen sänktes till10, 45 från 76, 61. Ytterligare ett inkorrekt svar gavs på fråga 4, som nu besvarades med ett annat svar än motsvarande korrekt fråga. Säkerhetspoängen för fråga 4 har sänkts från79, 91 till57, 75 vilket gör att den klarar tröskelvärdet på 50. Detta illustreras i Figur 4. Av de 12 svaren som gavs var det bara 3 som hade en säkerhetspoäng över trös- kelvärdet, jämfört med de 9 som låg över 50 bland de korrekt ställda frågorna. QnA Maker identifierar alltså inte de ord som stavats fel men resulterar istället i lägre säkerhetspoäng på samtliga frågor än om dessa ställts korrekt. Figur 10 visar hur många frågor som vardera respondent svarade rätt på.

Figur 10: Venndiagram som visar antalet frågor med felstavade ord, som GORCh, QnA Maker respektive mänsklig referens svarar rätt på

5.3

Frågor med synonymer till existerande ord

Tabell 5 visar den genomsnittliga säkerhetspoängen som QnA Maker gav för frågor med synonym. Säkerhetspoängen hamnade i genomsnitt på 32, 705. Av 12 frågor är det endast 4 av frågorna som ger en säkerhetspoäng över 50. 9 av 12 frågor besvaras korrekt.

Tabell 5: Nyckeltal för frågor med synonymer Genomsnittlig

säkerhet

Antal korrekta Antal >50 Antal felaktiga

>50

32, 705 9 4 1

Fråga 11 besvarades fortfarande fel med samma svar som QnA Maker gav i den korrekt ställda frågan.

Fråga 8 gav fel svar, men med en säkerhetspoäng på 12,55. Säkerhetspoängen var lägre än tröskelvärdet. Trots att QnA Maker svarade rätt på den korrekta frågan så gav den inte heller då en säkerhetspoäng över tröskelvärdet, vilket innebär att varken den korrekta frågan eller frågan med synonymer skulle ge ett svar som presenterades för användaren.

Figur 11 visar att människan klarade av att svara rätt på samtliga frågor med synonymer. För QnA Makers del är det bara 3 av svaren som både är korrekta och med en säkerhetspoäng över50.

Figur 11: Venndiagram som visar antalet frågor med synonymer, som GORCh, QnA Maker respektive mänsklig referens svarar rätt på

5.4

Frågor med slumpordnad ordföljd

För frågorna med slumpordnad ordföljd är resultaten identiska med resultaten för korrekta frågor. QnA Maker svarar likadant på samtliga frågor, med samma säkerhetspoäng som för korrekta frågor. Tabell 6 nedan visar nyckeltal för frå- gor med slumpordnad ordföljd. På grund av att svaren och säkerhetspoängen är identiska med svaren och säkerhetspoängen för korrekta frågor är tabellen identisk med Tabell 6.

Tabell 6: Nyckeltal frågor med slumpordnad ordföljd Genomsnittlig

säkerhet

Antal korrekta Antal >50 Antal felaktiga

>50

67, 84166667 11 9 1

Därmed är den genomsnittliga säkerhetspoängen som QnA Maker ger för frå- gorna i den här kategorin också ∼ 67, 8416. 11 av 12 frågor besvaras korrekt. Den tolfte frågan är fråga 11, som felaktigt passerar tröskelvärdet. 9 av frågorna får en säkerhetspoäng över rekommendationen på50.

I Figur 12 syns det att den slumpordnade ordföljden gjorde det svårare för människan att besvara frågorna.

Ordföljden verkar alltså inte påverka vilket svar som QnA Maker väljer eller vilken säkerhetspoäng den ger. Detta till skilnad från människan som uttryckte svårigheter med kontextplacering för dessa meningar. Det går inte att se att Microsoft Bot Framework på något sätt kollar på ordföljden och gör en tolkning av den överhuvudtaget.

Figur 12: Venndiagram som visar antalet frågor med slumpad ordföljd, som GORCh, QnA Maker respektive mänsklig referens svarar rätt på

5.5

Frågor med adderade känslofraser

För att besvara frågeställning [5] ställdes frågor med extra kontext och känslo- fraser. Nyckeltal för dessa frågor återfinns i Tabell 7.

Tabell 7: Nyckeltal frågor med känslofraser Genomsnittlig

säkerhet

Antal korrekta Antal >50 Antal felaktiga

>50

43, 83666667 9 4 0

När känslofraser och extra ord som varken fanns med i den korrekta frågan eller i kunskapsbasen lades till för att ge mer kontext till frågan, föll QnA Makers genomsnittliga säkerhetspoäng till∼ 43, 8367.

9 av de 12 frågorna besvaras korrekt, men det är bara 4 av frågorna som ger en säkerhetspoäng över 50. 3 av frågorna ger QnA Maker fel svar på, men i samtliga fall med en så pass låg säkerhetspoäng att de skulle filtreras bort.

Människan klarade av att sålla bort den tillagda informationen som känslofra- serna ger och svarade rätt på alla frågor.

Fråga 11 besvarades med samma felaktiga svar som när den var korrekt skriven, men frågan tappade så pass mycket i säkerhetspoäng att svaret nu filtreras bort.

I Figur 13 syns det att det är 4 av 12 frågor som QnA Maker klarade att ge korrekt svar på med en säkerhetspoäng över50.

Figur 13: Venndiagram som visar antalet frågor med slumpad ordföljd, som GORCh, QnA Maker respektive mänsklig referens svarar rätt på

Frågorna med adderade känslofraser blev per definition längre än de korrekta meningarna. Den tillagda texten gav läsaren en kontext eller sammanhang för den givna frågan. Om QnA Maker matchar frågan som skickas in med frågor och svar i kunskapsbasen ger den extra texten inte fler relevanta ord att matcha mot kunskapsbasen.

Att QnA Makers säkerhetspoäng sjunker när känslofraserna läggs till i frågorna skulle kunna stödja vad tidigare forskning visar; att tekniker som bygger på att leta efter nyckelord sannolikt fallerar för längre meningar som består av mer kontextuell information (Michaud, 2018). Detta togs upp i 3.6.

I den här undersökningen har människan svarat rätt på alla frågor med adderade känslofraser. Eftersom syftet med chatbot är att avlasta den mänskliga arbets- kraften i en kundtjänst är det rimligt att just människan klarar av att besvara frågorna korrekt och därmed kan ta över när en chatbot byggd på Microsoft Bot

Framework inte kan hantera frågan. Av den anledningen är Michauds förslag om att låta en människa svara på de frågor som är längre än en vald smärtgräns en rimlig lösning för att undvika felaktiga svar och för att öka säkerhetspoängen för de frågor som besvaras (Michaud, 2018).

5.6

Frågor med referensord

För att testa språkförståelsen gjordes tester med referensmeningar för att kunna jämföra hur säkerhetspoängen ändras beroende på om varianser av nyckelorden finns med i frågan eller inte. Referensmeningar togs fram genom att byta ut nyckelord från de korrekta meningarna mot ”abcdefg”. I Tabell 8 redovisas nyc- keltalen för meningsvarianserna med referensord.

Tabell 8: Nyckeltal för meningar med referensord Genomsnittlig

säkerhet

Antal korrekta Antal >50 Antal felaktiga

>50

34, 635 10 3 1

QnA Maker var mer osäker på referensmeningarna än de korrekta meningarna och fick en genomsnittlig säkerhetspoäng på34, 635, jämfört med∼ 67, 8416 på de korrekt ställda meningarna.

I Figur 14 finns ett venndiagram som visar antalet frågor med referensord, som GORCh, QnA Maker respektive mänsklig respondent svarar rätt på. Människan fick i den här kategorin bara möjlighet att svara på 11 frågor, istället för 12 på grund av ett misstag i framtagningen av frågeformuläret. Referensmeningarna främst är framtagna för att kunna avgöra om säkerhetspoängen påverkas mer när ordet är helt oigännkännligt än om det har stavats fel eller bytts ut mot en synonym, därför är detta ingenting som skulle påverka slutsatserna i testet.

Det var tre av frågorna som QnA Maker är så pass säker på att säkerhetspoängen passerar Microsofts tröskelvärde på50.

En av de frågor som passerar tröskelvärdet besvaras inkorrekt. Det är fråga 4 som får ett felaktigt svar med en säkerhetspoäng på 61, 61. Fråga 11 besvaras fel, med samma svar som för den korrekta frågan. På de övriga frågorna lyckas QnA Maker välja ut rätt svar, men med en låg säkerhetspoäng.

Människan klarade sig också sämre med referensmeningarna och valde på 6 av 11 frågor att inte svara något alls. De resterande 5 frågorna svarade människan rätt på. Diagrammet i Figur 9 visar att de 6 frågorna inte besvarades korrekt av varken människa, QnA Maker eller GORCh.

Figur 14: Venndiagram som visar antalet frågor med referensord, som GORCh, QnA Maker respektive mänsklig referens svarar rätt på

6

Diskussion och slutsatser

Kapitlet ger en sammanfattande beskrivning av studiens resultat. Vidare be- skrivs studiens implikationer och begränsningar. Dessutom beskrivs studiens slutsatser och rekommendationer. Kapitlet avslutas med förslag på vidare forsk- ning.

6.1

Resultat

På samtliga kategorier agerade QnA Maker som om ingen intelligent tolkning skett. Den enda kategorin där resultatet såg ut precis som i den där frågor- na formulerats korrekt var den med slumpordnad ordföljd. Här skulle dock en mänsklig intelligens enligt testerna uttrycka en höjd osäkerhet då kontexten för frågan blir mindre lättydd.

6.2

Implikationer

Det är fullt möjligt att kompensera för många av fallen, exempelvis genom att fylla i fler frågor eller genom att använda QnA Makers manuella synonymifyll- ning. Någon inbyggd intelligens för tolkning kan dock inte påvisas i den här undersökningen.

6.3

Slutsatser

6.3.1 Microsoft Bot Framework påverkas inte av ordföljder

När testet använde sig av frågor och jämförde dessa med varianser som hade en totalt slumpordnad ordföljd upptäcktes ingen skillnad. Microsoft Bot Fram- ework gav exakt samma svar med exakt samma säkerhetspoäng på samtliga frågor. Detta ger Bot Framework en viss styrka då det var ett område där en- dast människan stötte på problem men det antyder också om att Microsoft Bot Framework totalt saknar en kontext- eller meningsbyggnadsanalys.

6.3.2 Microsoft Bot Framework har ingen intelligens för förståelse

av stavfel

När stavfel lades in i en mening innebar det inget hinder för en människa att tolka. GORCh, som hade använts för att säkerställa att de stavfel som lades in inte återfanns i texten, missade samtliga svar. Vid detta läget hade Microsoft Bot Frameworks säkerhetspoäng fallit och var i merparten av fallen under den gräns på 50 säkerhetspoäng som Microsoft rekomenderar som tröskelvärde. Endast tre av tolv frågor passerade denna spärr och en av dessa tre besvarade inte frågan som ställts.

6.3.3 Microsoft Bot Framework har ingen intelligens för förståelse av synonymer

Vid inmatning av meningar där de felstavade orden istället ersatts med icke fö- rekommande ord av likartad betydelse gav Microsoft Bot Framework ett likartat tapp som i stavfelsfallet. Här är det dock viktigt att notera att Microsoft Bot Framework har ett inbyggt system där det går att manuellt koppla ord till deras synonymer men eftersom detta test enbart avser utgångsläget där en fråga nyss matats in dras slutsatsen ändå.

6.3.4 Microsoft Bot Framework har svårt för att hantera känslofra-

ser

När känslofraser adderades tappade Microsoft Bot Framework i säkerhet och klarade endast 4 av 12. Människan och GORCh kunde båda besvara samtliga frågor korrekt eftersom de hittade nyckelorden i texterna och ignorerade den extra informationen, men det klarade Microsoft Bot Framework inte av.

6.3.5 Microsoft Bot Framework kompenserar för sin brist på AI ge-

nom att sätta låg säkerhet på svaren

Vid alla varianser, ordföljd undantaget, tappade Microsoft Bot Framework till- räckligt mycket säkerhet för att kunna antyda om att en stor andel av frågorna som ställs med en sådan varians ej kommer besvaras. Det här gör att den, trots att intelligens för hantering och tolkning av ord verkar saknas, kan användas utan att vara rädd för att ens chatbot besvarar allt möjligt. Det filtret är inte perfekt och vi kan visa på flera fall där de med stor säkerhet släpper igenom felaktiga svar men blockerar korrekta. I samtliga fall, förutom det med addera- de känslofraser, släppte Microsoft Bot Framework igenom felaktiga svar med en säkerhet på över 50-spärren. I fallet med felstavade ord släpptes detta igenom trots att det enbart släppte igenom totalt 3 av de tolv frågorna. Detta anty- der om att Microsoft Bot Framework, vid tidigt användande, sannolikt kommer besvara frågor felaktigt.

6.4

Rekommendationer

6.4.1 Sätta högt tröskelvärde

Av den insamlade datan finns det frågor som av QnA Maker besvaras felaktigt som får en säkerhetspoäng över 70, närmare 80. Den här undersökningen kan inte visa på att det finns någon garanti för att något tröskelvärde förhindrar att felaktiga svar inte når slutanvändaren. Om hög reliabilitet är viktigt för imple- mentationen av en chatbot kan ett tröskelvärde närmare 100 öka reliabiliteten, men på bekostnad av att fler frågor inte besvaras alls av chatboten.

6.4.2 Låta användare hjälpa till att bygga upp kunskapsbas

En organisation som vill implementera en chatbot kan under en period sätta upp ett chattgränssnitt som liknar det som boten i framtiden kommer att använda, men låta en människa svara på frågorna samtidigt som de frågor som kommer in sparas undan för att manuellt granskas och därefter matas in i den skarpa kunskapsbasen. För att en chatbot ska kunna svara på frågor behöver den ha rätt kunskap för att besvara rätt frågor. Det är detta som (Michaud, 2018) tar upp och som beskrivs i 3.6.

6.5

Vidare forskning

6.5.1 Testa synonymer i QnA Maker

Det finns, som tidigare nämnts, möjligheten att i QnA Maker själv fylla i sy- nonymer. Genom att använda detta verktyg är det möjligt att frågeställning [2] kan besvaras annorlunda. En framtida studie kan upprepa testerna i det här arbetet med samma frågor för att se hur säkerheten påverkas och hur korrekt den svarar.

6.5.2 QnA-chatbot som svarar fel – vilken inverkan får det?

Vilken betydelse har en QnA-chatbot som svarar helt fel på frågorna som ställs till den. För en organisation som vill implementera en chatbot kan det vara intressant att ta reda på hur en chatbot som svarar fel eller på något annat vis svarar konstigt påverkar slutanvändarens förtoende för organisationen.

Referenser

Allwood, C. M. & Thomée, S. (1998, 07). Usability and database search at the swedish employment service. Behaviour & Information Technology , 17 , 231-241. doi: 10.1080/014492998119436

Borgman, C. L. (1986). Why are online catalogs hard to use? lessons learned from information-retrieval studies. Journal of the American Society for Information Science, 37 (6), 387-400. Hämtad från https:// onlinelibrary.wiley.com/doi/abs/10.1002/%28SICI%291097-4571%

28198611%2937%3A6%3C387%3A%3AAID-ASI3%3E3.0.CO%3B2-8 doi:

10.1002/(SICI)1097-4571(198611)37:6<387::AID-ASI3>3.0.CO;2-8 Chandler, D. & Munday, R. (2016). web scraping. Oxford University Press. Dahl, D. A., Norton, L. M. & Scholz, K. (2000). Commercialization of natural

language processing technology. Communications of the ACM , 43 (11es), 7.

Domstolsverket. (2019). Sveriges domstolar. Hämtad 30 juli 2019, från http:// www.domstol.se/Om-Sveriges-Domstolar/Domstolsverket/

Dooling, J. A. (2012). Advancing technology connects transcription and coding: The developing role of nlp, nlu, and cac in him. Journal of AHIMA, 83 (7), 52–53.

Gupta, C., Jain, A. & Joshi, N. (2018). Fuzzy logic in natural language processing–a closer view. Procedia computer science, 132 , 1375–1384. He, D., Wang, Z. & Liu, J. (2018). A survey to predict the trend of ai-able

server evolution in the cloud. IEEE Access, 6 , 10591-10602. doi: 10.1109/ ACCESS.2018.2801293

Johnson, R. (2017). Artificial intelligence. The Routledge Companion to Video Game Studies, 10-18.

Michaud, L. N. (2018, Sep.). Observations of a new chatbot: Drawing conclu- sions from early interactions with users. IT Professional , 20 (5), 40-47. doi: 10.1109/MITP.2018.053891336

Microsoft. (2019a). Använd bot med qna maker och luis för att

distribuera din kunskapsbas. Hämtad 1 augusti 2019, från

https://docs.microsoft.com/sv-se/azure/cognitive-services/ qnamaker/tutorials/integrate-qnamaker-luis

Microsoft. (2019b). Confidence score of a qna maker knowledge base. Häm- tad 1 augusti 2019, från https://docs.microsoft.com/en-us/azure/ cognitive-services/qnamaker/concepts/confidence-score

Microsoft. (2019c). Github - microsoft/botframework-sdk. Hämtad 1 augusti 2019, från https://github.com/microsoft/botframework-sdk

Microsoft. (2019d). Microsoft bot framework. Hämtad 1 augusti 2019, från https://dev.botframework.com/

Microsoft. (2019e). Vad är qna maker? - azure cognitive services. Häm- tad 1 augusti 2019, från https://docs.microsoft.com/sv-se/azure/ cognitive-services/qnamaker/overview/overview

Patel, R. & Davidson, B. (2011). Forskningsmetodikens grunder : att planera, genomföra och rapportera en undersökning (4., [uppdaterade] uppl. utgå- van). Lund: Studentlitteratur.

Shan, L. & Qun, Z. (2012, July). Flexible approach for web information extrac- tion based on htmlparser. I 2012 7th international conference on computer

science education (iccse) (s. 683-686). doi: 10.1109/ICCSE.2012.6295166

Skatteverket. (2019). Chatta med vår digitala medarbetare. Hämtad

30 juli 2019, från https://skatteverket.se/omoss/kontaktaoss/ chattamedvardigitalamedarbetare.4.2cf1b5cd163796a5c8b403b .html

White, G. M. (1995). Natural language understanding and speech recognition. I Readings in human–computer interaction (s. 554–563). Elsevier. Xu, Z. & Yan, D. (2011, Aug). Designing and implementing of the webpage

information extracting model based on tags. I 2011 international con- ference on intelligence science and information engineering (s. 273-275). doi: 10.1109/ISIE.2011.71

A

Källkod Crawler

Programkod 1: Frågeinsamlande web crawler 1 import u r l l i b . r e q u e s t 2 import s q l i t e 3 3 import bs4 4 import r e 5 import d a t e t i m e 6 import o s

7 from QnAList import QnAList

8 from H u m a n I n t e r a c t i o n L i s t import HumanList 9 10 from bs4 import B e a u t i f u l S o u p 11 12 b a s e U r l = " h t t p s : / / b e t a . d o m s t o l . s e " 13 s u b U r l = " h t t p s : / / b e t a . d o m s t o l . s e /amnen/ f a m i l j / s k i l s m a s s a / " 14 15 folder_name = s t r ( d a t e t i m e . d a t e t i m e . now ( ) ) 16 o s . mkdir ( folder_name ) 17 18 c o n n e c t i o n = s q l i t e 3 . c o n n e c t ( folder_name + " / l o c a l _ c h a t _ d a t a . db" ) 19

20 c o n n e c t i o n . e x e c u t e ( "CREATE␣TABLE␣ IF ␣NOT␣EXISTS␣ Answers ␣ ( "

21 " i d ␣INTEGER␣PRIMARY␣KEY␣AUTOINCREMENT, ␣ " 22 " answer ␣TEXT␣ " 23 " ) " ) 24 25 c o n n e c t i o n . e x e c u t e ( "CREATE␣TABLE␣ IF ␣NOT␣EXISTS␣Words␣ ( " 26 " i d ␣INTEGER␣PRIMARY␣KEY␣AUTOINCREMENT, ␣ " 27 " answer_id ␣INTEGER, ␣ " 28 " word ␣TEXT, ␣ " 29 "amount␣INTEGER, ␣ "

30 "FOREIGN␣KEY␣ ( answer_id ) ␣REFERENCES␣

Answers ( i d ) " 31 " ) " ) 32 33 c o n n e c t i o n . commit ( ) 34 35 36 c l a s s KeyPair :

37 def __init__ ( s e l f , t e x t , amount ) :

38 s e l f . t e x t = t e x t

39 s e l f . amount = amount

40

42 return s e l f . amount < o t h e r . amount 43 44 def g e t _ p a i r ( s e l f ) : 45 return s e l f . t e x t , s e l f . amount 46 47 48 def c r a w l ( u r l , q n a _ l i s t , human_list ) : 49 print ( u r l ) 50 s i t e = u r l l i b . r e q u e s t . u r l o p e n ( u r l ) . r e a d ( ) . d e c o d e ( " u t f −8" ) 51 soup = B e a u t i f u l S o u p ( s i t e , " html . p a r s e r " ) 52 53 html = [ x f o r x in soup i f i s i n s t a n c e ( x , bs4 . e l e m e n t . Tag ) ] [ 0 ] 54 body = [ x f o r x in html i f i s i n s t a n c e ( x , bs4 . e l e m e n t . Tag ) and x . name == " body " ] [ 0 ]

55

56 f o r e l e m e n t in body . f i n d _ a l l ( " u l " ) :

57 f o r i t e m in e l e m e n t . f i n d A l l ( " l i " , r e c u r s i v e=F a l s e ) :

58 new_tag = soup . new_tag ( " l i " )

59 new_tag . s t r i n g = "−␣" + item . t e x t 60 i t e m . r e p l a c e W i t h ( new_tag ) 61 62 a r t i c l e _ b o d y = body . f i n d A l l ( " d i v " , { " c l a s s " : " a r t i c l e _ _ b o d y " } ) 63 64 t a g _ l i s t = [ ] 65 66 try : 67 t a g _ l i s t = body . f i n d A l l ( " o l " , { " c l a s s " : " b r e a d c r u m b s _ _ l i s t " } ) [ 0 ] . f i n d A l l ( " l i " ) [ 2 : ] 68 except : 69 pass 70 l i n k s = soup . f i n d A l l ( " a " , { 71 " c l a s s " : " card__link " 72 } ) 73 74 [ s . e x t r a c t ( ) f o r s in soup ( [ ’ s t y l e ’ , ’ s c r i p t ’ , ’ [ document ] ’ , ’ head ’ , ’ t i t l e ’ ] ) ] # Removes

i n v i s i b l e s t u f f 75 76 i f len ( a r t i c l e _ b o d y ) : 77 c h i l d r e n = a r t i c l e _ b o d y [ 0 ] . f i n d C h i l d r e n ( r e c u r s i v e =F a l s e ) 78 f o r e l e m e n t in c h i l d r e n : 79 80 a r t i c l e B l o c k s = e l e m e n t . f i n d A l l ( " d i v " , { " c l a s s " : " e x p a n d a b l e−block " }) 81 i f ( len ( a r t i c l e B l o c k s ) ) :

82 f o r a r t i c l e B l o c k in a r t i c l e B l o c k s : 83 i f not " t i d s l i n j e " in a r t i c l e B l o c k . t e x t : 84 a r t i c l e H e a d e r = a r t i c l e B l o c k . f i n d A l l ( " span " , { " c l a s s " : " e x p a n d a b l e−b l o c k _ _ t i t l e " }) [ 0 ] 85 a r t i c l e C o n t e n t = a r t i c l e B l o c k . f i n d A l l ( " d i v " , { " c l a s s " : "u wysiwyg " } ) 86 a r t i c l e T e x t = " " 87 f o r t in a r t i c l e C o n t e n t : 88 a r t i c l e T e x t += t . t e x t 89 90 human_list . addHumanElement ( a r t i c l e H e a d e r , a r t i c l e T e x t , t a g _ l i s t ) 91 92 answer_id = c o n n e c t i o n . e x e c u t e (

93 "INSERT␣INTO␣ Answers ␣ ( answer )

␣VALUES␣ ( ’ " + a r t i c l e T e x t + " ’ ) " ) . l a s t r o w i d 94 95 q n a _ l i s t . addQnAElement (

Related documents