Spaces:
Runtime error
Runtime error
fixed some bugs
Browse files- app.py +1 -1
- data/twitterdata.csv +20 -5
- functions/functions.py +12 -0
- textclassifier/TextClassifier.py +13 -11
- twitterscraper/TwitterScraper.py +1 -1
app.py
CHANGED
@@ -66,7 +66,7 @@ if __name__ == "__main__":
|
|
66 |
# )
|
67 |
# demo.launch()
|
68 |
|
69 |
-
text_classifier = tc.TextClassifier(from_date='
|
70 |
text_classifier.run_main_pipeline()
|
71 |
print(get_summary_statistics(text_classifier.get_dataframe()))
|
72 |
print(type(get_summary_statistics(text_classifier.get_dataframe())))
|
|
|
66 |
# )
|
67 |
# demo.launch()
|
68 |
|
69 |
+
text_classifier = tc.TextClassifier(from_date='2019-07-01', to_date='2022-07-31', user_name=USER_LIST[1], num_tweets=20)
|
70 |
text_classifier.run_main_pipeline()
|
71 |
print(get_summary_statistics(text_classifier.get_dataframe()))
|
72 |
print(type(get_summary_statistics(text_classifier.get_dataframe())))
|
data/twitterdata.csv
CHANGED
@@ -1,6 +1,21 @@
|
|
1 |
id,tweet,date,user_id,username,urls,nlikes,nreplies,nretweets,class_tuple,main_topic,sub_topic,sentiment,target
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
id,tweet,date,user_id,username,urls,nlikes,nreplies,nretweets,class_tuple,main_topic,sub_topic,sentiment,target
|
2 |
+
1548051538966237186,@olofzonmarcus @kdriks ❤️❤️,2022-07-15 23:07:02,1407151866,BuschEbba,[],206,6,0,"(n/a, n/a, n/a, n/a)",n/a,n/a,n/a,n/a
|
3 |
+
1547174300100198400,"Över vårt sommarljusa Sverige faller nu ett mörker – nyheterna om den 9-åriga flickan lämnar ingen oberörd. Hos mig blandas sorg, vrede och bestörtning. Läs längre kommentar: https://t.co/Dc8UTQs4jm",2022-07-13 13:01:12,1407151866,BuschEbba,['https://www.facebook.com/100044182642032/posts/pfbid0RQnAUVZDDBvrxMyYT7MSLJkEzUm8gJZfAJCYc3zU3YUcsZ9dQbCid6orJPqTRYorl/?d=n'],3209,195,275,"(crime, child abuse, negative, the perpetrators)",crime,child abuse,negative,the perpetrators
|
4 |
+
1545832564388253696,Hej 50-talet! Det var ett tag sen nu men ibland så blir man påmind om att det fortfarande finns folk som tycker att en kvinna inte kan vara tillräcklig i sig själv. Sorgligt nog så är det också många gånger av andra kvinnor - som kallar sig ”feminister”. Kämpa. https://t.co/2Min2LyfQS,2022-07-09 20:09:38,1407151866,BuschEbba,[],893,58,39,"(feminism, social inequality, negative, people who think women can't be enough by themselves)",feminism,social inequality,negative,people who think women can't be enough by themselves
|
5 |
+
1544998212724989955,"Enligt uppg verkar det som att gärningsmannen har kopplingar till en nazistisk organisation. Avskyvärt. Oavsett motivet för gårdagens hemska dåd måste extremism bekämpas kraftfullare än idag. Vi behöver förbjuda deltagande i den typen av kriminella, våldsbejakande organisationer.",2022-07-07 12:54:13,1407151866,BuschEbba,[],479,88,13,"(extremism, nazism, negative, extremism)",extremism,nazism,negative,extremism
|
6 |
+
1544998118927859712,"Enligt kammaråklagaren var Ing-Marie Wieselgrens offentliga profil och engagemang sannolikt skäl till att hon mördades. Det är nattsvart att en person som påverkat så många, mördades på grund av det hon jobbade med. Skyddet för offentliganställda måste stärkas.",2022-07-07 12:53:50,1407151866,BuschEbba,[],1053,95,34,"(public servants, murdered public servant, negative, murdered public servant)",public servants,murdered public servant,negative,murdered public servant
|
7 |
+
1544678859655856130,Just hemkommen från Almedalen och nås av den hemska nyheten att en kvinna knivhuggits och allvarligt skadats vid Donners plats mitt i Visby 💔,2022-07-06 15:45:13,1407151866,BuschEbba,[],955,47,25,"(crime, knife attack, negative, woman)",crime,knife attack,negative,woman
|
8 |
+
1544652756841021440,Det sägs att bli härmad är den finaste komplimangen man kan få. Särskilt många komplimanger fick jag däremot inte 2016. Klipp från gårdagens Politikbyrån i SVT. https://t.co/nTcoOE3WwK,2022-07-06 14:01:30,1407151866,BuschEbba,[],3006,133,265,"(media, television, negative, self)",media,television,negative,self
|
9 |
+
1544381155943845893,Bra av @JohanPehrson om medelklassen — den måste vara öppen för fler och rörligheten uppåt öka. Ser fram emot att samarbeta kring detta efter valet.,2022-07-05 20:02:15,1407151866,BuschEbba,[],984,63,29,"(income inequality, social mobility, positive, middle class)",income inequality,social mobility,positive,middle class
|
10 |
+
1544316284636127233,"Sverige ska vara ett land där det är möjligt för alla att bygga sig ett gott liv. Vi kristdemokrater vill öppna upp Svenssonlivet för fler, vi vill hjälpa fler att uppnå de tre klassiska svenska V:na. Villan, Volvon och Vovven. https://t.co/DTtGpRAqdN",2022-07-05 15:44:28,1407151866,BuschEbba,['https://www.expressen.se/debatt/busch-svenssonlivet-ska-inte--vara-en-lyxvara-for-de-rikaste/'],1356,135,68,"(social policy, income inequality, positive, general public)",social policy,income inequality,positive,general public
|
11 |
+
1544210451764072448,"Sverige ska inte vara ett köland! KD är redo att ingå i en ny regering som tacklar köerna, levererar den stora vårdreform som behövs, och säkrar tryggheten i hela landet. Läs mer i DI Debatt inför vår dag i Almedalen: https://t.co/rSo9EWt63A",2022-07-05 08:43:56,1407151866,BuschEbba,['https://www.di.se/debatt/debatt-kolandet-sverige/'],938,112,55,"(healthcare, long wait times, positive, sweden)",healthcare,long wait times,positive,sweden
|
12 |
+
1543896057490415616,"Utmärkt tal av Ulf Kristersson. Tydligt om vad våra fyra partier som vill ha en ny start för Sverige är eniga om, i kontrast till vänsterkartellen. Tack för orden om KD:s tydlighet om vikten av en god vård i tid och äldreomsorg. Redo för en ny regering! @moderaterna",2022-07-04 11:54:38,1407151866,BuschEbba,[],2131,185,97,"(politics, government, positive, the moderate party)",politics,government,positive,the moderate party
|
13 |
+
1543847274945646592,Almedalens första tack går till @Anna_Ekstrom som såg att jag inte var helt med på morgonen och kosten kopp svart kaffe! 🙏 #Almedalen https://t.co/5p8b9VMvLR,2022-07-04 08:40:48,1407151866,BuschEbba,[],466,18,7,"(almedalen, almedalen's first thank you goes to @anna_ekstrom who saw that i was not quite with",almedalen,almedalen's first thank you goes to @anna_ekstrom who saw that i was not quite with,None,None
|
14 |
+
1543840671953555456,Supporttruppen har anlänt till Gotland. Kör så det ryker Ulf Kristersson @moderaterna #almedalen2022 https://t.co/i39h6M8ZBy,2022-07-04 08:14:34,1407151866,BuschEbba,[],4361,241,114,"(sweden, politics, positive, ulf kristersson @moderaterna)",sweden,politics,positive,ulf kristersson @moderaterna
|
15 |
+
1543675217565945857,Oslo. Och nu Köpenhamn. Fasansfulla bilder från den danska huvudstaden. Mina tankar är hos offren och alla deras anhöriga.,2022-07-03 21:17:06,1407151866,BuschEbba,[],1020,21,45,"(terrorism, suicide bombing, negative, victims and their families)",terrorism,suicide bombing,negative,victims and their families
|
16 |
+
1543624914254577666,Senaste dygnen har jag turnerat runt i vårt vackra land. Från Nyköping i öst till Halmstad & Markaryd i väst med mängder av stopp däremellan. Att få träffa så mkt folk var höjdpunkten och nådde sin absoluta kulmen i mötet med lille livräddaren Eton 😍 Nu mot Visby & Almedalen. https://t.co/AnGzK9K3MC,2022-07-03 17:57:13,1407151866,BuschEbba,[],1310,47,37,"(touring, none, positive, swedish people)",touring,none,positive,swedish people
|
17 |
+
1543567455397855232,Varken hushållen eller våra företag har råd med fyra år till av den här regeringens energipolitik. Socialdemokraterna har misslyckats - men våra fyra partier är ense om framtiden för energipolitiken. Den kommer innehålla ny kärnkraft. https://t.co/oKovG3Ha9c,2022-07-03 14:08:54,1407151866,BuschEbba,['https://www.dn.se/debatt/sa-skapar-vi-forutsattningar-for-att-bygga-ny-karnkraft/'],819,44,55,"(energy policy, nuclear power, positive, sweden)",energy policy,nuclear power,positive,sweden
|
18 |
+
1543196052077117441,@Catoman71 Stort! :),2022-07-02 13:33:04,1407151866,BuschEbba,[],23,1,0,"(n/a, n/a, n/a, n/a)",n/a,n/a,n/a,n/a
|
19 |
+
1543188983471132672,Ping @AckoAnkarberg @jakobforssmed @andreas_carlson @kommunalradet @germundsson @MiaFrisk,2022-07-02 13:04:59,1407151866,BuschEbba,[],25,9,3,"(local government, funding, neutral, local government)",local government,funding,neutral,local government
|
20 |
+
1543185686471315457,Inte förstått grejen med att partiledare lägger ut bilder på vad dem äter i parti och minut. Men däremot har jag nu förstått storheten i Småländsk kebabsås. Den här var mycket god på Rendez Vouz i Smålandsstenar. Uppfattat att det finns lokala variationer. Var finns den bästa? https://t.co/DkKR910RLR,2022-07-02 12:51:53,1407151866,BuschEbba,[],3124,470,58,"(food, kebabs, positive, rendez vouz)",food,kebabs,positive,rendez vouz
|
21 |
+
1542795970127314946,Varje dag anmäls 27 våldtäkter. Idag presenterar vi att våldtäktsmän och personer som begår sexualbrott mot barn ska kunna kastreras kemiskt. Om en person som Nytorgsmannen ska kunna bli fri ska kemisk kastrering ha skett innan frigivningen.,2022-07-01 11:03:17,1407151866,BuschEbba,[],4050,416,267,"(crime, sexual assault, negative, perpetrators)",crime,sexual assault,negative,perpetrators
|
functions/functions.py
CHANGED
@@ -26,4 +26,16 @@ def separate_string(string):
|
|
26 |
|
27 |
|
28 |
def convert_to_tuple(string):
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
return tuple(string.strip('()').split(', '))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
26 |
|
27 |
|
28 |
def convert_to_tuple(string):
|
29 |
+
"""
|
30 |
+
This function converts a string to a tuple.
|
31 |
+
:param string:
|
32 |
+
:return: tuple of strings
|
33 |
+
"""
|
34 |
+
string = string.strip()
|
35 |
return tuple(string.strip('()').split(', '))
|
36 |
+
|
37 |
+
|
38 |
+
|
39 |
+
if __name__ == '__main__':
|
40 |
+
s = ' (politics, government, negative, sweden)'
|
41 |
+
print(convert_to_tuple(s))
|
textclassifier/TextClassifier.py
CHANGED
@@ -48,10 +48,10 @@ class TextClassifier:
|
|
48 |
start_time = time.time()
|
49 |
while True:
|
50 |
self.df = self.ts.scrape_by_user(user_name)
|
51 |
-
if
|
52 |
break
|
53 |
else:
|
54 |
-
if time.time() - start_time >
|
55 |
raise Exception("Could not get enough tweets. Please try again. Perhaps try different time range.")
|
56 |
continue
|
57 |
# Make id as type int64
|
@@ -99,8 +99,9 @@ class TextClassifier:
|
|
99 |
|
100 |
@staticmethod
|
101 |
def cleanup_topic_results(text):
|
102 |
-
new_item = text.
|
103 |
-
new_item = new_item.replace("
|
|
|
104 |
return new_item
|
105 |
|
106 |
def df_to_csv(self, filename="{}/data/twitterdata.csv".format(ROOT_PATH)):
|
@@ -150,11 +151,12 @@ class TextClassifier:
|
|
150 |
df_topic['topics_temp'] = df_topic['class_tuple'].apply(f.convert_to_tuple)
|
151 |
df_topic_split = pd.DataFrame(df_topic['topics_temp'].tolist(),
|
152 |
columns=['main_topic', 'sub_topic', 'sentiment', 'target'])
|
153 |
-
|
154 |
-
self.df
|
155 |
-
|
156 |
-
self.df['
|
157 |
-
self.df['
|
|
|
158 |
|
159 |
def run_main_pipeline(self, filename="{}/data/twitterdata.csv".format(ROOT_PATH)):
|
160 |
"""
|
@@ -210,6 +212,6 @@ class TextClassifier:
|
|
210 |
|
211 |
|
212 |
if __name__ == "__main__":
|
213 |
-
text_classifier = TextClassifier(from_date=
|
214 |
-
num_tweets=
|
215 |
text_classifier.run_main_pipeline()
|
|
|
48 |
start_time = time.time()
|
49 |
while True:
|
50 |
self.df = self.ts.scrape_by_user(user_name)
|
51 |
+
if num_tweets-5 < len(self.df) <= num_tweets:
|
52 |
break
|
53 |
else:
|
54 |
+
if time.time() - start_time > 15:
|
55 |
raise Exception("Could not get enough tweets. Please try again. Perhaps try different time range.")
|
56 |
continue
|
57 |
# Make id as type int64
|
|
|
99 |
|
100 |
@staticmethod
|
101 |
def cleanup_topic_results(text):
|
102 |
+
new_item = text.strip()
|
103 |
+
new_item = new_item.replace("\n", "")
|
104 |
+
new_item = new_item.replace(" ", "")
|
105 |
return new_item
|
106 |
|
107 |
def df_to_csv(self, filename="{}/data/twitterdata.csv".format(ROOT_PATH)):
|
|
|
151 |
df_topic['topics_temp'] = df_topic['class_tuple'].apply(f.convert_to_tuple)
|
152 |
df_topic_split = pd.DataFrame(df_topic['topics_temp'].tolist(),
|
153 |
columns=['main_topic', 'sub_topic', 'sentiment', 'target'])
|
154 |
+
|
155 |
+
# Manually add columns to self.df
|
156 |
+
self.df['main_topic'] = df_topic_split['main_topic'].astype(str)
|
157 |
+
self.df['sub_topic'] = df_topic_split['sub_topic'].astype(str)
|
158 |
+
self.df['sentiment'] = df_topic_split['sentiment'].astype(str)
|
159 |
+
self.df['target'] = df_topic_split['target'].astype(str)
|
160 |
|
161 |
def run_main_pipeline(self, filename="{}/data/twitterdata.csv".format(ROOT_PATH)):
|
162 |
"""
|
|
|
212 |
|
213 |
|
214 |
if __name__ == "__main__":
|
215 |
+
text_classifier = TextClassifier(from_date='2019-01-01', to_date="2022-07-15", user_name='jimmieakesson',
|
216 |
+
num_tweets=60)
|
217 |
text_classifier.run_main_pipeline()
|
twitterscraper/TwitterScraper.py
CHANGED
@@ -27,7 +27,7 @@ class TwitterScraper(object):
|
|
27 |
# Make sure to_date is later than from_date
|
28 |
assert from_date < to_date, "from_date must be earlier than to_date"
|
29 |
# Make sure num_tweets is a positive integer
|
30 |
-
assert 0 < num_tweets <=
|
31 |
|
32 |
self.from_date = from_date
|
33 |
self.to_date = to_date
|
|
|
27 |
# Make sure to_date is later than from_date
|
28 |
assert from_date < to_date, "from_date must be earlier than to_date"
|
29 |
# Make sure num_tweets is a positive integer
|
30 |
+
assert 0 < num_tweets <= 60, "num_tweets must be a positive integer and at most 60"
|
31 |
|
32 |
self.from_date = from_date
|
33 |
self.to_date = to_date
|