Spaces:
Running
Running
Julien Chaumond
commited on
Commit
·
6556bb5
1
Parent(s):
4bd86de
Checkpoint 2
Browse files- index.html +1 -9
- js-src/Displacy.ts +50 -0
- js-src/coref.ts +6 -2
- js-src/zController.ts +1 -0
- less/style.less +6 -1
- less/zDisplacy.less +143 -0
index.html
CHANGED
@@ -32,15 +32,7 @@
|
|
32 |
</a>-->
|
33 |
</div>
|
34 |
|
35 |
-
<div class="
|
36 |
-
displaCy uses JavaScript, SVG and CSS to show you how computers understand language
|
37 |
-
|
38 |
-
<br>
|
39 |
-
<br>
|
40 |
-
<br>
|
41 |
-
<br>
|
42 |
-
|
43 |
-
<div class="displacy-google">'<mark data-entity="work_of_art">Lawrence of Arabia</mark>' is a highly rated <mark data-entity="work_of_art">film biography</mark> about <mark data-entity="location">British</mark> <mark data-entity="person">Lieutenant</mark> <mark data-entity="person">T. E. Lawrence</mark>. <mark data-entity="person">Peter O'Toole</mark> plays <mark data-entity="person">Lawrence</mark> in the <mark data-entity="work_of_art">film</mark>.</div>
|
44 |
</div>
|
45 |
|
46 |
<script src="/dist/script.js"></script>
|
|
|
32 |
</a>-->
|
33 |
</div>
|
34 |
|
35 |
+
<div class="container">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
</div>
|
37 |
|
38 |
<script src="/dist/script.js"></script>
|
js-src/Displacy.ts
ADDED
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Indicates position of spans of text inside the string.
|
5 |
+
* (for visual applications only, no semantic sense here.)
|
6 |
+
*/
|
7 |
+
interface Span {
|
8 |
+
type: string;
|
9 |
+
start: number;
|
10 |
+
end: number;
|
11 |
+
}
|
12 |
+
|
13 |
+
class Displacy {
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Render a text string and its entity spans
|
17 |
+
*
|
18 |
+
* *see displacy-ent.js*
|
19 |
+
*/
|
20 |
+
static render(text: string, spans: Span[]): string {
|
21 |
+
let out = {
|
22 |
+
__content: "",
|
23 |
+
append(s: string) {
|
24 |
+
this.__content += s;
|
25 |
+
}
|
26 |
+
};
|
27 |
+
let offset = 0;
|
28 |
+
|
29 |
+
spans.forEach(({ type, start, end }) => {
|
30 |
+
const entity = text.slice(start, end);
|
31 |
+
const fragments = text.slice(offset, start).split('\n');
|
32 |
+
|
33 |
+
fragments.forEach((fragment, i) => {
|
34 |
+
out.append(fragment);
|
35 |
+
if (fragments.length > 1 && i !== fragments.length - 1) {
|
36 |
+
out.append('<br>');
|
37 |
+
}
|
38 |
+
});
|
39 |
+
|
40 |
+
// Breaking change from displacy-ent.js:
|
41 |
+
// We do not filter any entity type out.
|
42 |
+
out.append(`<mark data-entity=${ type.toLowerCase() }>${ entity }</mark>`);
|
43 |
+
|
44 |
+
offset = end;
|
45 |
+
});
|
46 |
+
|
47 |
+
out.append(text.slice(offset, text.length));
|
48 |
+
return out.__content;
|
49 |
+
}
|
50 |
+
}
|
js-src/coref.ts
CHANGED
@@ -31,6 +31,7 @@ class Coref {
|
|
31 |
endpoint: string;
|
32 |
onStart = () => {};
|
33 |
onSuccess = () => {};
|
|
|
34 |
|
35 |
constructor(endpoint: string, opts: any) {
|
36 |
this.endpoint = endpoint;
|
@@ -55,13 +56,16 @@ class Coref {
|
|
55 |
this.render(res);
|
56 |
}
|
57 |
else {
|
58 |
-
console.
|
59 |
}
|
60 |
};
|
61 |
request.send();
|
62 |
}
|
63 |
|
64 |
render(res: Response) {
|
65 |
-
|
|
|
|
|
|
|
66 |
}
|
67 |
}
|
|
|
31 |
endpoint: string;
|
32 |
onStart = () => {};
|
33 |
onSuccess = () => {};
|
34 |
+
container?: HTMLElement;
|
35 |
|
36 |
constructor(endpoint: string, opts: any) {
|
37 |
this.endpoint = endpoint;
|
|
|
56 |
this.render(res);
|
57 |
}
|
58 |
else {
|
59 |
+
console.error('Error', request);
|
60 |
}
|
61 |
};
|
62 |
request.send();
|
63 |
}
|
64 |
|
65 |
render(res: Response) {
|
66 |
+
const markup = Displacy.render(res.cleanedText, (<any>res).entities);
|
67 |
+
if (!this.container) { return ; }
|
68 |
+
console.log(markup);
|
69 |
+
this.container.innerHTML = `<div class="text">${markup}</div>`;
|
70 |
}
|
71 |
}
|
js-src/zController.ts
CHANGED
@@ -27,6 +27,7 @@ const updateURL = (text) => {
|
|
27 |
document.addEventListener('DOMContentLoaded', () => {
|
28 |
const $input = document.querySelector('input.input-message') as HTMLInputElement;
|
29 |
const $form = document.querySelector('form.js-form') as HTMLFormElement;
|
|
|
30 |
|
31 |
{
|
32 |
// Initial text
|
|
|
27 |
document.addEventListener('DOMContentLoaded', () => {
|
28 |
const $input = document.querySelector('input.input-message') as HTMLInputElement;
|
29 |
const $form = document.querySelector('form.js-form') as HTMLFormElement;
|
30 |
+
coref.container = document.querySelector('.container') as HTMLElement;
|
31 |
|
32 |
{
|
33 |
// Initial text
|
less/style.less
CHANGED
@@ -55,7 +55,12 @@ code, pre {
|
|
55 |
}
|
56 |
}
|
57 |
|
58 |
-
|
|
|
|
|
|
|
|
|
|
|
59 |
|
60 |
|
61 |
/**
|
|
|
55 |
}
|
56 |
}
|
57 |
|
58 |
+
.container {
|
59 |
+
font-size: 20px;
|
60 |
+
overflow-x: auto;
|
61 |
+
white-space: nowrap;
|
62 |
+
padding: 180px 40px;
|
63 |
+
}
|
64 |
|
65 |
|
66 |
/**
|
less/zDisplacy.less
ADDED
@@ -0,0 +1,143 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
.entities {
|
3 |
+
line-height: 2
|
4 |
+
}
|
5 |
+
[data-entity] {
|
6 |
+
padding: 0.25em 0.35em;
|
7 |
+
margin: 0 0.25em;
|
8 |
+
line-height: 1;
|
9 |
+
display: inline-block;
|
10 |
+
border-radius: 0.25em;
|
11 |
+
border: 1px solid
|
12 |
+
}
|
13 |
+
[data-entity]:after {
|
14 |
+
box-sizing: border-box;
|
15 |
+
content: attr(data-entity);
|
16 |
+
font-size: 0.6em;
|
17 |
+
line-height: 1;
|
18 |
+
padding: 0.35em 0.35em;
|
19 |
+
border-radius: 0.35em;
|
20 |
+
text-transform: uppercase;
|
21 |
+
display: inline-block;
|
22 |
+
vertical-align: middle;
|
23 |
+
margin: 0 0 0.1rem 0.5rem
|
24 |
+
}
|
25 |
+
[data-entity][data-entity="person"] {
|
26 |
+
background: rgba(166, 226, 45, 0.2);
|
27 |
+
border-color: #a6e22d
|
28 |
+
}
|
29 |
+
[data-entity][data-entity="person"]:after {
|
30 |
+
background: #a6e22d
|
31 |
+
}
|
32 |
+
[data-entity][data-entity="norp"] {
|
33 |
+
background: rgba(224, 0, 132, 0.2);
|
34 |
+
border-color: #e00084
|
35 |
+
}
|
36 |
+
[data-entity][data-entity="norp"]:after {
|
37 |
+
background: #e00084
|
38 |
+
}
|
39 |
+
[data-entity][data-entity="facility"] {
|
40 |
+
background: rgba(67, 198, 252, 0.2);
|
41 |
+
border-color: #43c6fc
|
42 |
+
}
|
43 |
+
[data-entity][data-entity="facility"]:after {
|
44 |
+
background: #43c6fc
|
45 |
+
}
|
46 |
+
[data-entity][data-entity="org"] {
|
47 |
+
background: rgba(67, 198, 252, 0.2);
|
48 |
+
border-color: #43c6fc
|
49 |
+
}
|
50 |
+
[data-entity][data-entity="org"]:after {
|
51 |
+
background: #43c6fc
|
52 |
+
}
|
53 |
+
[data-entity][data-entity="gpe"] {
|
54 |
+
background: rgba(253, 151, 32, 0.2);
|
55 |
+
border-color: #fd9720
|
56 |
+
}
|
57 |
+
[data-entity][data-entity="gpe"]:after {
|
58 |
+
background: #fd9720
|
59 |
+
}
|
60 |
+
[data-entity][data-entity="loc"] {
|
61 |
+
background: rgba(253, 151, 32, 0.2);
|
62 |
+
border-color: #fd9720
|
63 |
+
}
|
64 |
+
[data-entity][data-entity="loc"]:after {
|
65 |
+
background: #fd9720
|
66 |
+
}
|
67 |
+
[data-entity][data-entity="product"] {
|
68 |
+
background: rgba(142, 125, 255, 0.2);
|
69 |
+
border-color: #8e7dff
|
70 |
+
}
|
71 |
+
[data-entity][data-entity="product"]:after {
|
72 |
+
background: #8e7dff
|
73 |
+
}
|
74 |
+
[data-entity][data-entity="event"] {
|
75 |
+
background: rgba(255, 204, 0, 0.2);
|
76 |
+
border-color: #fc0
|
77 |
+
}
|
78 |
+
[data-entity][data-entity="event"]:after {
|
79 |
+
background: #fc0
|
80 |
+
}
|
81 |
+
[data-entity][data-entity="work_of_art"] {
|
82 |
+
background: rgba(255, 204, 0, 0.2);
|
83 |
+
border-color: #fc0
|
84 |
+
}
|
85 |
+
[data-entity][data-entity="work_of_art"]:after {
|
86 |
+
background: #fc0
|
87 |
+
}
|
88 |
+
[data-entity][data-entity="language"] {
|
89 |
+
background: rgba(255, 204, 0, 0.2);
|
90 |
+
border-color: #fc0
|
91 |
+
}
|
92 |
+
[data-entity][data-entity="language"]:after {
|
93 |
+
background: #fc0
|
94 |
+
}
|
95 |
+
[data-entity][data-entity="date"] {
|
96 |
+
background: rgba(47, 187, 171, 0.2);
|
97 |
+
border-color: #2fbbab
|
98 |
+
}
|
99 |
+
[data-entity][data-entity="date"]:after {
|
100 |
+
background: #2fbbab
|
101 |
+
}
|
102 |
+
[data-entity][data-entity="time"] {
|
103 |
+
background: rgba(47, 187, 171, 0.2);
|
104 |
+
border-color: #2fbbab
|
105 |
+
}
|
106 |
+
[data-entity][data-entity="time"]:after {
|
107 |
+
background: #2fbbab
|
108 |
+
}
|
109 |
+
[data-entity][data-entity="percent"] {
|
110 |
+
background: rgba(153, 153, 153, 0.2);
|
111 |
+
border-color: #999
|
112 |
+
}
|
113 |
+
[data-entity][data-entity="percent"]:after {
|
114 |
+
background: #999
|
115 |
+
}
|
116 |
+
[data-entity][data-entity="money"] {
|
117 |
+
background: rgba(153, 153, 153, 0.2);
|
118 |
+
border-color: #999
|
119 |
+
}
|
120 |
+
[data-entity][data-entity="money"]:after {
|
121 |
+
background: #999
|
122 |
+
}
|
123 |
+
[data-entity][data-entity="quantity"] {
|
124 |
+
background: rgba(153, 153, 153, 0.2);
|
125 |
+
border-color: #999
|
126 |
+
}
|
127 |
+
[data-entity][data-entity="quantity"]:after {
|
128 |
+
background: #999
|
129 |
+
}
|
130 |
+
[data-entity][data-entity="ordinal"] {
|
131 |
+
background: rgba(153, 153, 153, 0.2);
|
132 |
+
border-color: #999
|
133 |
+
}
|
134 |
+
[data-entity][data-entity="ordinal"]:after {
|
135 |
+
background: #999
|
136 |
+
}
|
137 |
+
[data-entity][data-entity="cardinal"] {
|
138 |
+
background: rgba(153, 153, 153, 0.2);
|
139 |
+
border-color: #999
|
140 |
+
}
|
141 |
+
[data-entity][data-entity="cardinal"]:after {
|
142 |
+
background: #999
|
143 |
+
}
|