-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path2_eurovoc_adding.R
148 lines (118 loc) · 5.5 KB
/
2_eurovoc_adding.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#Prend le résultat d'un topic modeling effectué avec mallet et ajoute les eurovocs
library(readr)
library(dplyr)
library(tidyr)
library(data.table)
source("get_fingerprint.R") #imitation du fingerprint d'Open Refine
#on importe les labels
dcb_topic_labels <- fread("dcb-topic-labels.csv",
col.names = c("topic_id", "token"),
encoding = "Latin-1")
View(dcb_topic_labels)
#ATTENTION : problème avec les étranges caractères si on importe en UTF-8
#la variable "n.topwords" vient du topic modeling (en général 20 labels)
labels <-
dcb_topic_labels %>%
separate(token, into=as.character(1:n.topwords), sep=" ")
#réorganiser topics sous forme de DB, afin de minimiser les matchings ?
labels_tidy <-
melt(labels, id.vars = c("topic_id"),
measure.vars = 2:20) %>%
select(topic_id, value) %>%
arrange(topic_id)
#on importe le thésaurus nettoyé
thesaurus <-
fread("~/eurovoc_topicmodeling/eurovoc_thesaurus_complet.csv", encoding="UTF-8")
#On stemme les tokens (vérifier si ça marche mieux que sans)
#verifier avec un algo moins agressif que porter
# labels_tidy_stem <-
# labels_tidy[,.(topic_id, value, stem = SnowballC::wordStem(value, language = "porter"))]
######################################
#jointure des unigrammes
######################################
#jointure avec le thesaurus sur les stems
labels_tidy_joined_unigrams <- labels_tidy %>%
fuzzyjoin::stringdist_left_join(thesaurus,
by = c(value = "fingerprint_cleaned"),
distance_col = "dist",
max_dist = 0,
method = "lv") %>%
arrange(as.integer(topic_id), term) %>%
filter(!is.na(term)) %>%
select(topic_id, value, term, french, length, profondeur, category, link, bt1, mt, domain)
# matched <- colMeans(!is.na(labels_tidy_joined))['term']
# print(paste0("Le poucentage de matching est de ", round(matched, 2)))
#essais de summarisation
# df <- labels_tidy_joined %>%
# group_by(topic_id, mt) %>%
# summarise(total.domain=n()) %>%
# arrange(as.integer(topic_id))
#
# View(df)
######################################
#création des bigrammes et fingerprint
######################################
bigrammes <-
melt(setDT(labels_tidy),
id.var = c("topic_id"))[, combn(value, 2, FUN = paste, collapse = ' '), topic_id]
bigrammes <- bigrammes[,.(topic_id, V1, fingerprint = get_fingerprint(V1))]
setnames(bigrammes, "V1", "value")
#on stemme les bigrammes
bigrammes$fingerprint_stem <- strsplit(bigrammes$fingerprint, " ", fixed = TRUE) %>%
lapply(., function(x) SnowballC::wordStem(x, language = "porter") ) %>%
vapply(., function(x) paste(x, collapse = " "), character(1))
#test de fuzzy join sur une partie des bigrammes
labels_tidy_joined_bigrams <- bigrammes %>%
fuzzyjoin::stringdist_inner_join(thesaurus[length==2],
by = c(fingerprint_stem = "fingerprint_stem"),
distance_col = "dist",
max_dist=0,
ignore_case = TRUE,
method = "lv") %>%
select(topic_id, value, term, french, length, profondeur, category, link, bt1, mt, domain)
######################################
#création des trigrammes et fingerprint
######################################
trigrammes <-
melt(setDT(labels_tidy),
id.var = c("topic_id"))[, combn(value, 3, FUN = paste, collapse = ' '), topic_id]
trigrammes <- trigrammes[,.(topic_id, V1, fingerprint = get_fingerprint(V1))]
setnames(trigrammes, "V1", "value")
#on stemme les bigrammes
trigrammes$fingerprint_stem <- strsplit(trigrammes$fingerprint, " ", fixed = TRUE) %>%
lapply(., function(x) SnowballC::wordStem(x, language = "porter") ) %>%
vapply(., function(x) paste(x, collapse = " "), character(1))
#test de fuzzy join sur une partie des bigrammes
labels_tidy_joined_trigrams <- trigrammes %>%
fuzzyjoin::stringdist_inner_join(thesaurus[length<2],
by = c(fingerprint_stem = "fingerprint_stem"),
distance_col = "dist",
max_dist=0,
ignore_case = TRUE,
method = "lv") %>%
select(topic_id, value, term, french, length, profondeur, category, link, bt1, mt, domain)
#On merge les unigrams, bigrammes et trigrammes matchés
merged <- rbind(labels_tidy_joined_unigrams,
labels_tidy_joined_bigrams,
labels_tidy_joined_trigrams)
#on réconcilie les topics_id des termes matchés avec la matrice doc.topics transposée
doc.topics_t <-
doc.topics %>%
as.data.frame() %>%
tibble::rownames_to_column("fichier") %>%
gather(topic_id, proportion, 2:21)
final <-
doc.topics_t %>%
left_join(merged)
#On retente de faire la somme cumulée des proportions de chaque token
somme_cumulee <-
final %>%
group_by(fichier, term) %>%
summarise(somme = sum(proportion)*100) %>%
mutate(file_id=stringr::str_extract(""))
filter(somme >= 5)
fwrite(somme_cumulee, "somme_cumulee.csv")
#il faut maintenant comparer avec les eurovocs manuels
jrc_metadata <- fread("~/eurovoc_topicmodeling/jrc_acquis_metadata.csv") %>%
select(-body)
fwrite(jrc_metadata, "jrc_metatada_sansbody.csv")