Some Code, Details, & Tables in Identifying Relevant Dutch Words
Using Vagrant for PySpark Setup
source: https://github.com/spark-mooc/mooc-setup/
source: https://spark.apache.org/docs/1.2.0/programming-guide.html
Test synced local folder
source: https://www.vagrantup.com/docs/synced-folders/basic_usage.html
os.listdir('/localMACHINE/STUDY/')
Function - Remove Punctuation
import re
def removePunctuation(text):
"""Removes punctuation, changes to lower case, and strips leading and trailing spaces.
Note:
Only spaces, letters, and numbers should be retained. Other characters should should be
eliminated (e.g. it's becomes its). Leading and trailing spaces should be removed after
punctuation is removed.
Args:
text (str): A string.
Returns:
str: The cleaned up string.
"""
return re.sub(r'[^\w ]', '', text).strip().lower()
print removePunctuation('Hi, you!')
print removePunctuation(' No under_score!')
print removePunctuation(' * Remove punctuation then spaces * ')
Out:
hi you
no under_score
remove punctuation then spaces
Import Stop Words
import csv
stopwords = []
with open(stopwordsDir + 'stopwords_table.csv', 'r') as f:
reader = csv.reader(f, delimiter=',')
reader.next()
for row in reader:
stopwords.append(row[1])
print len(stopwords)
print stopwords[:5]
print stopwords[-5:]
Out:
106
['aan', 'af', 'al', 'alles', 'als']
['zij', 'zijn', 'zo', 'zonder', 'zou']
Function - Remove Stop Words
def stopwordsRemove(text):
return ' '.join([term for term in text.split() if term not in stopwords])
one day test - remove
onedayRDD_witout = (sc.textFile(oneday)
.map(removePunctuation)
.map(stopwordsRemove)
)
print '\n'.join(onedayRDD_witout
.zipWithIndex() # to (line, lineNum)
.map(lambda (l, num): '{0}: {1}'.format(num, l)) # to 'lineNum: line'
.take(5))
Out:
0: update 1015 uur den bosch rechtbank den bosch maandag faillissement uitgesproken modeketen houtbrox vier aanverwante vennootschappen
1:
2: bewindvoerders dienden aanvraag maandagmorgen rechtbank winkels maandag opengegaan
3: bewindvoerder floris dix denkt vanuit faillissement betere mogelijkheid doorstart bereiken afgelopen dagen tien genteresseerden modeketen bewindvoerders gemeld dix verwacht faillissement zelfs kandidaat kopers aandienenvoor 528 medewerkers dreigt ontslag eerste tijd salarissen hetuwv betaald afgelopen dagen bewindvoerders meeste leveranciers overeenstemming bereikt kleding vanaf datum eerder uitgesproken surseance verkochtbewindvoerder dix denkt enkele weken duurt voordat overeenkomst gesloten mogelijke doorstart tijd winkels zeker open houden geeft beste garantie doorstart
4: update 1716uur moergestel a58 tussen oirschot moergestel maandagmiddag ongeluk tussen 4 autos gebeurd verkeer richting tilburg kwam daardoor file terecht
Function - Keep Stop Words
def stopwordsKeep(text):
return ' '.join([term for term in text.split() if term in stopwords])
one day test - keep
onedayRDD_wit = (sc.textFile(oneday)
.map(removePunctuation)
.map(stopwordsKeep)
)
print '\n'.join(onedayRDD_wit
.zipWithIndex() # to (line, lineNum)
.map(lambda (l, num): '{0}: {1}'.format(num, l)) # to 'lineNum: line'
.take(5))
Out:
0: de in heeft het van en
1:
2: de de in bij de de zijn wel
3: dat een een is een te de hebben zich al in de zich bij de dat er na een nog meer zich de nu ook de worden de nog wel door in de hebben de al wel met de over de die de van de worden dat het nog wel een kan worden over een tot die wil hij de want dat de op een
4: op de en is een het in een
Multiple Subfolders
source: http://stackoverflow.com/questions/24029873/how-to-read-multiple-text-files-into-a-single-rdd
subfolders = [x for x in os.listdir(baseDir2) if '2016' in x and 'csv' not in x]
sf_string = ''
for folder in subfolders:
sf_string = sf_string + baseDir2 + '/' + folder + ','
sf_string = sf_string[:-1]
sf_string[:250]
Out:
'/localMACHINE/STUDY/ep8/20160519_goingDutch/articles/20160509_0918,/localMACHINE/STUDY/ep8/20160519_goingDutch/articles/20160509_1504,/localMACHINE/STUDY/ep8/20160519_goingDutch/articles/20160510_0934,/localMACHINE/STUDY/ep8/20160519_goingDutch/artic'
ALL without stop words
allday_sw0_RDD = (sc.textFile(sf_string)
.map(removePunctuation)
.map(stopwordsRemove)
)
print allday_sw0_RDD.collect()[-1]
print allday_sw0_RDD.count()
allday_sw0_WordsRDD = allday_sw0_RDD.flatMap(lambda x: x.split(' '))
allday_sw0_WordCount = allday_sw0_WordsRDD.count()
print allday_sw0_WordsRDD.top(5)
print allday_sw0_WordCount
Out:
politie doet onderzoek alle drie incidenten hoopt hulp mensen stad tijdens incidenten actief zoek slachtoffer11 aanh 1 persoon vandoor ging parade sloeg sfeer totaal resultaat 11 aanhoudingen inzet tshoostbrabant22 verdachten zware mish opruiing voldoen vordering aanzetten wanordelijkheden drukke nacht geworden
928
[u'zwolle', u'zwolle', u'zwolle', u'zwolle', u'zwijgzaam']
19354
allWords_sw0_RDD = allday_sw0_WordsRDD.filter(lambda x: x != '')
allWords_sw0_Count = allWords_sw0_RDD.count()
print allWords_sw0_Count## ALL without stop words
top15BDall_sw0_WordsAndCounts = wordCount(allWords_sw0_RDD).takeOrdered(15, key=lambda x: -x[1])
print '\n'.join(map(lambda (w, c): '{0}: {1}'.format(w, c), top15BDall_sw0_WordsAndCounts))
Out:
18953
politie: 152
bosch: 149
den: 138
tilburg: 107
uur: 91
volgens: 87
jaar: 76
mensen: 67
gaat: 62
man: 51
onderzoek: 50
twee: 47
komen: 46
rond: 45
nederland: 45
top100BD_nonSW = wordCount(allWords_sw0_RDD).takeOrdered(100, key=lambda x: -x[1])
top100BD_nonSW[:10]
Out:
[(u'politie', 152),
(u'bosch', 149),
(u'den', 138),
(u'tilburg', 107),
(u'uur', 91),
(u'volgens', 87),
(u'jaar', 76),
(u'mensen', 67),
(u'gaat', 62),
(u'man', 51)]
termsDir = '/localMACHINE/STUDY/ep8/20160519_goingDutch/terms/'
with open(termsDir + 'top100_nonStopWords.txt', 'w') as f:
for term in top100BD_nonSW:
f.write(term[0] + ',' + str(term[1]) + '\n')
ALL stop words
allday_sw1_RDD = (sc.textFile(sf_string)
.map(removePunctuation)
.map(stopwordsKeep)
)
print allday_sw1_RDD.collect()[-1]
print allday_sw1_RDD.count()
allday_sw1_WordsRDD = allday_sw1_RDD.flatMap(lambda x: x.split(' '))
allday_sw1_WordCount = allday_sw1_WordsRDD.count()
print allday_sw1_WordsRDD.top(5)
print allday_sw1_WordCount
allWords_sw1_RDD = allday_sw1_WordsRDD.filter(lambda x: x != '')
allWords_sw1_Count = allWords_sw1_RDD.count()
print allWords_sw1_Count
top15BDall_sw1_WordsAndCounts = wordCount(allWords_sw1_RDD).takeOrdered(15, key=lambda x: -x[1])
print '\n'.join(map(lambda (w, c): '{0}: {1}'.format(w, c), top15BDall_sw1_WordsAndCounts))
Out:
de nog naar de en op van die in de waren de ook is zij op naar het na die er de om van niet tot toch nog een
928
[u'zou', u'zou', u'zou', u'zou', u'zou']
15685
15267
de: 2481
van: 1078
het: 1063
een: 923
in: 861
en: 615
op: 544
is: 435
dat: 403
te: 324
met: 316
zijn: 304
voor: 278
die: 245
er: 239
bigrams, baby!
source: http://www.mccarroll.net/blog/pyspark2/
sentences = sc.textFile(sf_string) \
.glom() \
.map(lambda x: " ".join(x)) \
.flatMap(lambda x: x.split("."))
bigrams = sentences.map(removePunctuation) \
.map(lambda x:x.split()) \
.flatMap(lambda x: [((x[i],x[i+1]),1) for i in range(0,len(x)-1)])
freq_bigrams = bigrams.reduceByKey(lambda x,y:x+y) \
.map(lambda x:(x[1],x[0])) \
.sortByKey(False)
freq_bigrams.take(15)
Out:
[(274, (u'van', u'de')),
(227, (u'in', u'de')),
(145, (u'de', u'politie')),
(141, (u'op', u'de')),
(118, (u'den', u'bosch')),
(115, (u'van', u'het')),
(102, (u'in', u'het')),
(86, (u'aan', u'de')),
(77, (u'van', u'een')),
(73, (u'voor', u'de')),
(71, (u'over', u'de')),
(62, (u'in', u'een')),
(62, (u'met', u'een')),
(60, (u'bij', u'de')),
(58, (u'met', u'de'))]
termsDir = '/localMACHINE/STUDY/ep8/20160519_goingDutch/terms/'
with open(termsDir + 'BD_bigrams.txt', 'w') as f:
for bi in freq_bigrams.take(50):
count = bi[0]
big = ' '.join([bi[1][0], bi[1][1]])
f.write(str(count) + ',' + big + '\n')
all articles via sklearn
source: http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html
http://www.markhneedham.com/blog/2015/02/15/pythonscikit-learn-calculating-tfidf-on-how-i-met-your-mother-transcripts/
articleDir = 'articles/'
os.listdir(articleDir)
subfolders = [x for x in os.listdir(articleDir) if 'csv' not in x]
print len(subfolders)
subfolders[:10]
Out:
62
['20160418_1727',
'20160419_0923',
'20160419_1314',
'20160419_1643',
'20160420_0918',
'20160420_1305',
'20160420_1655',
'20160421_0916',
'20160421_1210',
'20160422_0955']
articles = defaultdict(list)
articleCnt = 1
for sub in subfolders[:3]:
stories = os.listdir(articleDir + sub)
for story in stories:
with open(articleDir + sub + '/' + story, 'r') as f:
for line in f:
articles[articleCnt].append(removePunctuation(line.strip()))
articleCnt += 1
print len(articles)
Out:
9
for article_id, text in articles.iteritems():
articles[article_id] = "".join(text)
articles[1]
Out:
'update 1015 uur den bosch de rechtbank in den bosch heeft maandag het faillissement uitgesproken van modeketen houtbrox en vier aanverwante vennootschappende bewindvoerders dienden de aanvraag maandagmorgen in bij de rechtbank de winkels zijn maandag wel opengegaanbewindvoerder floris dix denkt dat vanuit een faillissement een betere mogelijkheid is een doorstart te bereiken de afgelopen dagen hebben zich al tien genteresseerden in de modeketen zich bij de bewindvoerders gemeld dix verwacht dat er na een faillissement zelfs nog meer kandidaat kopers zich aandienenvoor de 528 medewerkers dreigt nu ook ontslag de eerste tijd worden de salarissen nog wel door hetuwv betaald in de afgelopen dagen hebben de bewindvoerders al wel met de meeste leveranciers overeenstemming bereikt over de kleding die vanaf de datum van de eerder uitgesproken surseance worden verkochtbewindvoerder dix denkt dat het nog wel enkele weken duurt voordat een overeenkomst gesloten kan worden over een mogelijke doorstart tot die tijd wil hij de winkels zeker open houden want dat geeft de beste garantie op een doorstart'
corpus = []
for id, article in sorted(articles.iteritems(), key=lambda t: int(t[0])):
corpus.append(article)
corpus[:2]
Out:
['update 1015 uur den bosch de rechtbank in den bosch heeft maandag het faillissement uitgesproken van modeketen houtbrox en vier aanverwante vennootschappende bewindvoerders dienden de aanvraag maandagmorgen in bij de rechtbank de winkels zijn maandag wel opengegaanbewindvoerder floris dix denkt dat vanuit een faillissement een betere mogelijkheid is een doorstart te bereiken de afgelopen dagen hebben zich al tien genteresseerden in de modeketen zich bij de bewindvoerders gemeld dix verwacht dat er na een faillissement zelfs nog meer kandidaat kopers zich aandienenvoor de 528 medewerkers dreigt nu ook ontslag de eerste tijd worden de salarissen nog wel door hetuwv betaald in de afgelopen dagen hebben de bewindvoerders al wel met de meeste leveranciers overeenstemming bereikt over de kleding die vanaf de datum van de eerder uitgesproken surseance worden verkochtbewindvoerder dix denkt dat het nog wel enkele weken duurt voordat een overeenkomst gesloten kan worden over een mogelijke doorstart tot die tijd wil hij de winkels zeker open houden want dat geeft de beste garantie op een doorstart',
'update 1716uur moergestel op de a58 tussen oirschot en moergestel is maandagmiddag een ongeluk tussen 4 autos gebeurd het verkeer richting tilburg kwam daardoor in een file terechteen tijd lang was alleen de vluchtstrook open rond 1645 uur werd de weg weer vrijgegeven de file was op dat moment13kilometer langer is een omleiding ingesteldhet is niet bekend of er gewonden zijn gevallen en hoe het ongeluk heeft kunnen gebeurenkijkersfilein de tegengestelde richting eindhoven ontstond een kijkersfile van 6 kilometer tussen tilburg centrumoost en oirschot dat leverde10 minuten vertraging opa58 eindhoventilburg file door ongeval verkeer richting tilburgbreda volg vanaf knooppunt batadorp den bosch a2a65botsing met 4 autos op a58 eindhoven tilburg tussen oirschot en moergestel 4 km file alleen de vluchtstrook is nog open']
from sklearn.feature_extraction.text import TfidfVectorizer
tf = TfidfVectorizer(analyzer='word', ngram_range=(1,3),
min_df = 0, stop_words = list(set(stopwords)), smooth_idf=False)
tfidf_matrix = tf.fit_transform(corpus)
feature_names = tf.get_feature_names()
len(feature_names)
Out:
2031
feature_names[90:100]
Out:
[u'aanwezig',
u'aanwezig tilburgse',
u'aanwezig tilburgse wijk',
u'absoluut',
u'absoluut vrij',
u'absoluut vrij surfen',
u'achterhoek',
u'achterhoek zutphen',
u'achterhoek zutphen verwacht',
u'achtjaar']
dense = tfidf_matrix.todense()
len(dense[0].tolist()[0])
Out:
2031
reviewing one article
article1 = dense[0].tolist()[0]
phrase_scores = [pair for pair in zip(range(0, len(article1)), article1) if pair[1] > 0]
len(phrase_scores)
Out:
242
sorted(phrase_scores, key=lambda t: t[1] * -1)[:5]
Out:
[(245, 0.17863433615755836),
(555, 0.17863433615755836),
(108, 0.11908955743837224),
(396, 0.11908955743837224),
(473, 0.11908955743837224)]
for scores in sorted(phrase_scores, key=lambda t: t[1] * -1)[:5]:
print scores[0], feature_names[scores[0]]
Out:
245 bewindvoerders
555 faillissement
108 afgelopen dagen
396 dagen
473 dix denkt
sorted_phrase_scores = sorted(phrase_scores, key=lambda t: t[1] * -1)
for phrase, score in [(feature_names[word_id], score) for (word_id, score) in sorted_phrase_scores][:20]:
print('{0: <20} {1}'.format(phrase, score))
Out:
bewindvoerders 0.178634336158
faillissement 0.178634336158
afgelopen dagen 0.119089557438
dagen 0.119089557438
dix denkt 0.119089557438
maandag 0.119089557438
modeketen 0.119089557438
rechtbank 0.119089557438
uitgesproken 0.119089557438
dix 0.117253012408
doorstart 0.117253012408
tijd 0.093271355127
afgelopen 0.0781686749388
bosch 0.0781686749388
den 0.0781686749388
den bosch 0.0781686749388
denkt 0.0781686749388
winkels 0.0781686749388
1015 0.0595447787192
1015 uur 0.0595447787192
all word scores exported (subset)
with open("terms/tfidf_scikit.csv", "wb") as file:
writer = csv.writer(file, delimiter=",")
writer.writerow(["ArticleId", "Phrase", "Score"])
doc_id = 0
for doc in tfidf_matrix.todense():
print "Document %d" %(doc_id)
word_id = 0
for score in doc.tolist()[0]:
if score > 0:
word = feature_names[word_id]
writer.writerow([doc_id+1, word.encode("utf-8"), score])
word_id +=1
doc_id +=1
Out:
Document 0
Document 1
Document 2
Document 3
Document 4
Document 5
Document 6
Document 7
Document 8
top word/article by tf-idf (subset)
with open("terms/tfidf_scikit_top_word.csv", "wb") as file:
writer = csv.writer(file, delimiter=",")
writer.writerow(["ArticleId", "Phrase", "Score"])
doc_id = 0
for doc in tfidf_matrix.todense():
word_id = 0
top_score = 0
for score in doc.tolist()[0]:
if score > top_score:
word = feature_names[word_id]
top_score = score
word_id +=1
print "article %d\t tf-idf score: %f\t\t top word: %s" % (doc_id, top_score, word)
writer.writerow([doc_id+1, word.encode("utf-8"), top_score])
doc_id +=1
Out:
article 0 tf-idf score: 0.178634 top word: bewindvoerders
article 1 tf-idf score: 0.234007 top word: file
article 2 tf-idf score: 0.267838 top word: turnhout
article 3 tf-idf score: 0.122609 top word: 15
article 4 tf-idf score: 0.185682 top word: waspik
article 5 tf-idf score: 0.192862 top word: gedetineerden
article 6 tf-idf score: 0.204391 top word: maart
article 7 tf-idf score: 0.122609 top word: 15
article 8 tf-idf score: 0.266699 top word: scooter
all articles
articles = defaultdict(list)
articleCnt = 1
for sub in subfolders:
stories = os.listdir(articleDir + sub)
for story in stories:
with open(articleDir + sub + '/' + story, 'r') as f:
for line in f:
articles[articleCnt].append(removePunctuation(line.strip()))
articleCnt += 1
print len(articles)
Out:
185
for article_id, text in articles.iteritems():
articles[article_id] = "".join(text)
corpus = []
for id, article in sorted(articles.iteritems(), key=lambda t: int(t[0])):
corpus.append(article)
corpus[-2:]
Out:
['tilburg er is met mijn gezondheid en die van anderen gespeeldmustafa el mahdioui uit tilburg is ervan overtuigd dat hij kanker kreeg doordat hij treinen moest schuren met verf met chroom 6de tilburger werkte van 2004 tot 2011 met tussenpozen veelvuldig bij trom het reintegratiebedrijf van de gemeente dat vijftien treinen opknapte voor met name het spoorwegmuseum in utrechtel mahdioui kreeg in 2014 de diagnose lymfklierkanker na een aantal chemobehandelingen is hij inmiddels schoon verklaard maar het blijft als een sluipmoordenaar op je schouder zitten de tilburger gaf herhaaldelijk te kennen dat hij niet tegen het stof kon maar werd gedreigd met korting op zijn uitkeringde tilburger werkte van 2004 tot 2011 met tussenpozen veelvuldig bij trom het reintegratiebedrijf van de gemeente dat vijftien treinen opknapte voor met name het spoorwegmuseum in utrechtel mahdioui kreeg in 2014 de diagnose lymfklierkanker na een aantal chemobehandelingen is hij inmiddels schoon verklaard maar het blijft als een sluipmoordenaar op je schouder zitten de tilburger gaf herhaaldelijk te kennen dat hij niet tegen het stof kon maar werd gedreigd met korting op zijn uitkeringheeft u tussen 2004 en 2011 via integratiebedrijf trom in de nswerkplaats tilburg gewerkt met chroom 6 beschilderde treinen of heeft u als nswerknemer in de tilburgse werkplaats met de verf gewerkthet brabants dagblad wil graag met u in contact komen stuur ons een bericht via oproepbdnl',
'den bosch tilburg jongerenwerk dat zich richt op het ontwikkelen van talenten voor bijvoorbeeld sport of muziek helpt bij het voorkomen van jeugdcriminaliteit bij jongerendat blijkt uit onderzoek in den bosch en tilburg van avansdocente maike kooijmans waarmee ze vrijdag 13 mei promoveert aan de universiteit van amsterdamvolgens kooijmans helpt het echter alleen bij jongeren die nog geen delicten plegen of die alleen beginnend crimineel gedrag vertonen bij jongeren die al op het criminele pad zijn sorteren de talentenontwikkelingprogrammas weinig effectde avansdocente en senior onderzoekster volgde samen met jongerenwerkers en medeonderzoekers van avansdrie jaar lang een groep van 50 jongerendie jongens namen deel aanhet voetbalproject doelbewust van welzijnsorganisatie divers uit den bosch en artistieke talentprojecten van het jongerenwerk rnewt van contourdetwern in tilburgexplosieve toenamede afgelopen jaren nam het aantal talentprogrammas door het jongerenwerk explosief toe maar f en hoe talentprogrammas werken werd volgens kooijmansniet eerder onderzocht twee getallen inhet onderzoek van kooijmans zetten de toonbij aanvang van het project blijkt 50 procent van de groep ooit een delict te hebben gepleegd maar in de eindfase van het onderzoek wist 78 procent uit de criminaliteit te kunnen blijven alleen lijken de projecten het risico op delinquentie niet te verminderen voor jongens die al meerdere delicten hebben gepleegdmaike kooijmans beschrijft haar resultaten en concrete tips in het boek talent van de straat hoe je jongeren kunt verleiden uit de criminaliteit te blijven het boek is vanaf 13 mei verkrijgbaar']
tf = TfidfVectorizer(analyzer='word', ngram_range=(1,3),
min_df = 0, stop_words = list(set(stopwords)), smooth_idf=False)
tfidf_matrix = tf.fit_transform(corpus)
feature_names = tf.get_feature_names()
len(feature_names)
Out:
37952
with open("terms/tfidf_scikit_top_word_ALL.csv", "wb") as file:
writer = csv.writer(file, delimiter=",")
writer.writerow(["ArticleId", "Phrase", "Score"])
doc_id = 0
for doc in tfidf_matrix.todense():
word_id = 0
top_score = 0
for score in doc.tolist()[0]:
if score > top_score:
word = feature_names[word_id]
top_score = score
word_id +=1
# print "article %d\t tf-idf score: %f\t\t top word: %s" % (doc_id, top_score, word)
writer.writerow([doc_id+1, word.encode("utf-8"), top_score])
doc_id +=1
Out:
import article metadata and join with top tf-idf data
articleDir = 'articles/'
os.listdir(articleDir)
metafiles = [x for x in os.listdir(articleDir) if 'csv' in x]
print len(metafiles)
metafiles[:10]
Out:
62
['20160418_1727.csv',
'20160419_0923.csv',
'20160419_1314.csv',
'20160419_1643.csv',
'20160420_0918.csv',
'20160420_1305.csv',
'20160420_1655.csv',
'20160421_0916.csv',
'20160421_1210.csv',
'20160422_0955.csv']
articles_df = pd.DataFrame()
for f in metafiles:
temp_df = pd.read_csv(articleDir + f, encoding='utf8')
articles_df = articles_df.append(temp_df)
print articles_df.shape
articles_df.drop('Unnamed: 0', axis=1, inplace=True)
articles_df['ArticleId'] = range(1, (articles_df.shape[0] + 1))
# articles_df.set_index('ArticleId', drop=True, inplace=True)
articles_df.head()
Out:
(185, 9)
date | link | location_main | locations | map | timestamp | title | txt_file | ArticleId | |
---|---|---|---|---|---|---|---|---|---|
0 | 18 april 2016 | http://www.bd.nl/regio/oss-uden-veghel-e-o/ude... | Uden | [Home, Regio, Oss, Uden, Veghel e.o., Uden] | [http://maps.google.com/maps?q=51.6631071,+5.6... | 20160418_1727 | Faillissement HoutBrox uitgesproken | 20160418/story1.txt | 1 |
1 | 18 april 2016 | http://www.bd.nl/regio/112-nieuws/ongeluk-tuss... | 112 Nieuws | [Home, Regio, 112 Nieuws] | NaN | 20160418_1727 | Ongeluk tussen 4 auto's op A58 zorgt voor file... | 20160418/story2.txt | 2 |
2 | 18 april 2016 | http://www.bd.nl/regio/boxtel-schijndel-e-o/ha... | Haaren | [Home, Regio, Boxtel, Schijndel e.o., Haaren] | [http://maps.google.com/maps?q=51.6268095,+5.2... | 20160418_1727 | Zelfs stuntman had auto met moeite zo in huis ... | 20160418/story3.txt | 3 |
0 | 19 april 2016 | http://www.bd.nl/regio/economie/15-kandidaat-k... | Economie | [Home, Regio, Economie ] | NaN | 20160419_0923 | Al 15 kandidaat-kopers voor failliete modekete... | 20160419/story1.txt | 4 |
1 | 19 april 2016 | http://www.bd.nl/regio/112-nieuws/5-gewonden-b... | 112 Nieuws | [Home, Regio, 112 Nieuws] | [http://maps.google.com/maps?q=51.6843118,+4.9... | 20160419_0923 | 5 gewonden bij ongeluk Waspik | 20160419/story2.txt | 5 |
tfidf_df = pd.read_csv('terms/tfidf_scikit_top_word_ALL.csv', encoding='utf8')
# tfidf_df.set_index('ArticleId', drop=True, inplace=True)
tfidf_df.head()
Out:
ArticleId | Phrase | Score | |
---|---|---|---|
0 | 1 | bewindvoerders | 0.186731 |
1 | 2 | file | 0.191202 |
2 | 3 | turnhout | 0.281711 |
3 | 4 | succesvolle doorstart | 0.127030 |
4 | 5 | waspik | 0.174633 |
article_merge = pd.merge(articles_df, tfidf_df, how='outer', on='ArticleId')
print article_merge.columns
article_merge.head()
Out:
Index([ u'date', u'link', u'location_main', u'locations',
u'map', u'timestamp', u'title', u'txt_file',
u'ArticleId', u'Phrase', u'Score'],
dtype='object')
date | link | location_main | locations | map | timestamp | title | txt_file | ArticleId | Phrase | Score | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 18 april 2016 | http://www.bd.nl/regio/oss-uden-veghel-e-o/ude... | Uden | [Home, Regio, Oss, Uden, Veghel e.o., Uden] | [http://maps.google.com/maps?q=51.6631071,+5.6... | 20160418_1727 | Faillissement HoutBrox uitgesproken | 20160418/story1.txt | 1 | bewindvoerders | 0.186731 |
1 | 18 april 2016 | http://www.bd.nl/regio/112-nieuws/ongeluk-tuss... | 112 Nieuws | [Home, Regio, 112 Nieuws] | NaN | 20160418_1727 | Ongeluk tussen 4 auto's op A58 zorgt voor file... | 20160418/story2.txt | 2 | file | 0.191202 |
2 | 18 april 2016 | http://www.bd.nl/regio/boxtel-schijndel-e-o/ha... | Haaren | [Home, Regio, Boxtel, Schijndel e.o., Haaren] | [http://maps.google.com/maps?q=51.6268095,+5.2... | 20160418_1727 | Zelfs stuntman had auto met moeite zo in huis ... | 20160418/story3.txt | 3 | turnhout | 0.281711 |
3 | 19 april 2016 | http://www.bd.nl/regio/economie/15-kandidaat-k... | Economie | [Home, Regio, Economie ] | NaN | 20160419_0923 | Al 15 kandidaat-kopers voor failliete modekete... | 20160419/story1.txt | 4 | succesvolle doorstart | 0.127030 |
4 | 19 april 2016 | http://www.bd.nl/regio/112-nieuws/5-gewonden-b... | 112 Nieuws | [Home, Regio, 112 Nieuws] | [http://maps.google.com/maps?q=51.6843118,+4.9... | 20160419_0923 | 5 gewonden bij ongeluk Waspik | 20160419/story2.txt | 5 | waspik | 0.174633 |
article_merge.to_csv('terms/article_meta_merge.csv', encoding='utf8')
Out:
article_merge2 = article_merge[['ArticleId', 'timestamp', 'title', 'location_main', 'Phrase', 'Score']]
article_merge2.head()
Out:
ArticleId | timestamp | title | location_main | Phrase | Score | |
---|---|---|---|---|---|---|
0 | 1 | 20160418_1727 | Faillissement HoutBrox uitgesproken | Uden | bewindvoerders | 0.186731 |
1 | 2 | 20160418_1727 | Ongeluk tussen 4 auto's op A58 zorgt voor file... | 112 Nieuws | file | 0.191202 |
2 | 3 | 20160418_1727 | Zelfs stuntman had auto met moeite zo in huis ... | Haaren | turnhout | 0.281711 |
3 | 4 | 20160419_0923 | Al 15 kandidaat-kopers voor failliete modekete... | Economie | succesvolle doorstart | 0.127030 |
4 | 5 | 20160419_0923 | 5 gewonden bij ongeluk Waspik | 112 Nieuws | waspik | 0.174633 |
article_merge2.to_csv('terms/article_tfidf_merge.csv', encoding='utf8')
Out:
article_merge2.groupby('location_main').count().sort('ArticleId', ascending=False)
Out:
C:\Anaconda2\lib\site-packages\ipykernel__main__.py:1: FutureWarning: sort(columns=….) is deprecated, use sort_values(by=…..)
if name == ‘main’:
ArticleId | timestamp | title | Phrase | Score | |
---|---|---|---|---|---|
location_main | |||||
112 Nieuws | 40 | 40 | 40 | 40 | 40 |
Brabant | 26 | 26 | 26 | 26 | 26 |
Tilburg | 25 | 25 | 25 | 25 | 25 |
's-Hertogenbosch | 22 | 22 | 22 | 22 | 22 |
Binnenland | 15 | 15 | 15 | 15 | 15 |
Sport | 7 | 7 | 7 | 7 | 7 |
Hilvarenbeek | 6 | 6 | 6 | 6 | 6 |
Oss | 6 | 6 | 6 | 6 | 6 |
Uden | 5 | 5 | 5 | 5 | 5 |
Vught | 3 | 3 | 3 | 3 | 3 |
Sint-Michielsgestel | 3 | 3 | 3 | 3 | 3 |
Zaltbommel | 3 | 3 | 3 | 3 | 3 |
Haaren | 3 | 3 | 3 | 3 | 3 |
Economie | 2 | 2 | 2 | 2 | 2 |
Willem II | 2 | 2 | 2 | 2 | 2 |
Loon op Zand | 2 | 2 | 2 | 2 | 2 |
Schijndel | 2 | 2 | 2 | 2 | 2 |
Buitenland | 2 | 2 | 2 | 2 | 2 |
Heusden | 1 | 1 | 1 | 1 | 1 |
Waalwijk | 1 | 1 | 1 | 1 | 1 |
Boekel | 1 | 1 | 1 | 1 | 1 |
Voetbal | 1 | 1 | 1 | 1 | 1 |
FC Oss | 1 | 1 | 1 | 1 | 1 |
FC Den Bosch | 1 | 1 | 1 | 1 | 1 |
PSV | 1 | 1 | 1 | 1 | 1 |
Gemert-Bakel | 1 | 1 | 1 | 1 | 1 |
Oisterwijk | 1 | 1 | 1 | 1 | 1 |
Goirle | 1 | 1 | 1 | 1 | 1 |
Lintjes | 1 | 1 | 1 | 1 | 1 |
article_titles = list(article_merge2.title)
article_titles[:5]
Out:
[u'Faillissement HoutBrox uitgesproken',
u"Ongeluk tussen 4 auto's op A58 zorgt voor file richting Tilburg",
u'Zelfs stuntman had auto met moeite zo in huis Helvoirt gekregen',
u'Al 15 kandidaat-kopers voor failliete modeketen HoutBrox',
u'5 gewonden bij ongeluk Waspik']