Spaces:
Sleeping
Sleeping
abadesalex
commited on
Commit
β’
8765030
1
Parent(s):
838d68f
plot and logic
Browse files- FastAPI/app/__pycache__/api.cpython-310.pyc +0 -0
- FastAPI/app/api.py +34 -7
- FastAPI/app/build copy/static/js/main.d4022087.js +0 -0
- FastAPI/app/build copy/static/js/main.d4022087.js.LICENSE.txt +0 -39
- FastAPI/app/build copy/static/js/main.d4022087.js.map +0 -0
- FastAPI/app/build/asset-manifest.json +3 -3
- FastAPI/app/build/index.html +1 -1
- FastAPI/app/build/static/js/main.98763516.js +0 -0
- FastAPI/app/build/static/js/main.98763516.js.LICENSE.txt +136 -0
- FastAPI/app/build/static/js/main.98763516.js.map +0 -0
- FastAPI/app/{build copy β build_copy_v1}/asset-manifest.json +3 -3
- FastAPI/app/{build copy β build_copy_v1}/favicon.ico +0 -0
- FastAPI/app/{build copy β build_copy_v1}/index.html +1 -1
- FastAPI/app/{build copy β build_copy_v1}/logo192.png +0 -0
- FastAPI/app/{build copy β build_copy_v1}/logo512.png +0 -0
- FastAPI/app/{build copy β build_copy_v1}/manifest.json +0 -0
- FastAPI/app/{build copy β build_copy_v1}/robots.txt +0 -0
- FastAPI/app/{build β build_copy_v1}/static/js/main.e17bd3d9.js +0 -0
- FastAPI/app/{build β build_copy_v1}/static/js/main.e17bd3d9.js.LICENSE.txt +0 -0
- FastAPI/app/{build β build_copy_v1}/static/js/main.e17bd3d9.js.map +0 -0
- FastAPI/app/build_copy_v2/asset-manifest.json +10 -0
- FastAPI/app/build_copy_v2/favicon.ico +0 -0
- FastAPI/app/build_copy_v2/index.html +1 -0
- FastAPI/app/build_copy_v2/logo192.png +0 -0
- FastAPI/app/build_copy_v2/logo512.png +0 -0
- FastAPI/app/build_copy_v2/manifest.json +25 -0
- FastAPI/app/build_copy_v2/robots.txt +3 -0
- FastAPI/app/build_copy_v2/static/js/main.ed106e83.js +0 -0
- FastAPI/app/build_copy_v2/static/js/main.ed106e83.js.LICENSE.txt +121 -0
- FastAPI/app/build_copy_v2/static/js/main.ed106e83.js.map +0 -0
- FastAPI/app/utils/__pycache__/embedding.cpython-310.pyc +0 -0
- FastAPI/app/utils/embedding.py +8 -0
- FastAPI/requirements.txt +6 -1
- FastAPI/test.ipynb +106 -0
- my-app/package-lock.json +0 -0
- my-app/package.json +4 -1
- my-app/src/App.js +0 -53
- my-app/src/Components/ActiveWords/index.jsx +66 -0
- my-app/src/Components/Body/index.jsx +32 -0
- my-app/src/Components/Context/WordsContext.js +6 -0
- my-app/src/Components/CreateWord/CreateWord.jsx +65 -0
- my-app/src/Components/Header/index.jsx +19 -0
- my-app/src/Components/Plot/index.jsx +62 -0
- my-app/src/Components/WordCard/index.jsx +26 -0
- my-app/src/index.js +12 -8
- my-app/testPlot.jsx +88 -0
- prev.tsx +18 -0
FastAPI/app/__pycache__/api.cpython-310.pyc
CHANGED
Binary files a/FastAPI/app/__pycache__/api.cpython-310.pyc and b/FastAPI/app/__pycache__/api.cpython-310.pyc differ
|
|
FastAPI/app/api.py
CHANGED
@@ -3,9 +3,11 @@ from fastapi.middleware.cors import CORSMiddleware
|
|
3 |
from fastapi.staticfiles import StaticFiles
|
4 |
from fastapi.responses import FileResponse
|
5 |
|
|
|
|
|
|
|
6 |
app = FastAPI()
|
7 |
-
|
8 |
-
# CORS setup
|
9 |
origins = [
|
10 |
"http://localhost:3000",
|
11 |
"http://localhost:8000",
|
@@ -21,7 +23,9 @@ app.add_middleware(
|
|
21 |
)
|
22 |
|
23 |
# Mount static files
|
24 |
-
app.mount(
|
|
|
|
|
25 |
|
26 |
|
27 |
# Serve index.html at the root
|
@@ -29,10 +33,33 @@ app.mount("/static", StaticFiles(directory="app/build/static", html=True), name=
|
|
29 |
def read_root():
|
30 |
return FileResponse("app/build/index.html")
|
31 |
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
|
37 |
|
38 |
if __name__ == "__main__":
|
|
|
3 |
from fastapi.staticfiles import StaticFiles
|
4 |
from fastapi.responses import FileResponse
|
5 |
|
6 |
+
from app.utils.embedding import get_embedding
|
7 |
+
|
8 |
+
|
9 |
app = FastAPI()
|
10 |
+
|
|
|
11 |
origins = [
|
12 |
"http://localhost:3000",
|
13 |
"http://localhost:8000",
|
|
|
23 |
)
|
24 |
|
25 |
# Mount static files
|
26 |
+
app.mount(
|
27 |
+
"/static", StaticFiles(directory="app/build/static", html=True), name="static"
|
28 |
+
)
|
29 |
|
30 |
|
31 |
# Serve index.html at the root
|
|
|
33 |
def read_root():
|
34 |
return FileResponse("app/build/index.html")
|
35 |
|
36 |
+
|
37 |
+
words_db = []
|
38 |
+
|
39 |
+
|
40 |
+
@app.get("/api/words", tags=["words"])
|
41 |
+
async def get_todos() -> dict:
|
42 |
+
return {"data": words_db}
|
43 |
+
|
44 |
+
|
45 |
+
@app.post("/api/add-word", tags=["words"])
|
46 |
+
async def add_word(word: dict) -> dict:
|
47 |
+
words_db.append(word)
|
48 |
+
word_to_embbed = word["id"]
|
49 |
+
word_embedding = get_embedding(word_to_embbed)[:3]
|
50 |
+
word["embedding"] = word_embedding.tolist()
|
51 |
+
return {"data": {"Succesful"}}
|
52 |
+
|
53 |
+
|
54 |
+
@app.delete("/api/delete-word/{word_id}", tags=["words"])
|
55 |
+
async def delete_word(word_id: str) -> dict:
|
56 |
+
word_id = int(word_id)
|
57 |
+
for word in words_db:
|
58 |
+
if int(word["id"]) == word_id:
|
59 |
+
print("found")
|
60 |
+
words_db.remove(word)
|
61 |
+
return {"data": {"Succesful"}}
|
62 |
+
return {"data": {"Word not found"}}
|
63 |
|
64 |
|
65 |
if __name__ == "__main__":
|
FastAPI/app/build copy/static/js/main.d4022087.js
DELETED
The diff for this file is too large to render.
See raw diff
|
|
FastAPI/app/build copy/static/js/main.d4022087.js.LICENSE.txt
DELETED
@@ -1,39 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* @license React
|
3 |
-
* react-dom.production.min.js
|
4 |
-
*
|
5 |
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
6 |
-
*
|
7 |
-
* This source code is licensed under the MIT license found in the
|
8 |
-
* LICENSE file in the root directory of this source tree.
|
9 |
-
*/
|
10 |
-
|
11 |
-
/**
|
12 |
-
* @license React
|
13 |
-
* react-jsx-runtime.production.min.js
|
14 |
-
*
|
15 |
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
16 |
-
*
|
17 |
-
* This source code is licensed under the MIT license found in the
|
18 |
-
* LICENSE file in the root directory of this source tree.
|
19 |
-
*/
|
20 |
-
|
21 |
-
/**
|
22 |
-
* @license React
|
23 |
-
* react.production.min.js
|
24 |
-
*
|
25 |
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
26 |
-
*
|
27 |
-
* This source code is licensed under the MIT license found in the
|
28 |
-
* LICENSE file in the root directory of this source tree.
|
29 |
-
*/
|
30 |
-
|
31 |
-
/**
|
32 |
-
* @license React
|
33 |
-
* scheduler.production.min.js
|
34 |
-
*
|
35 |
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
36 |
-
*
|
37 |
-
* This source code is licensed under the MIT license found in the
|
38 |
-
* LICENSE file in the root directory of this source tree.
|
39 |
-
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FastAPI/app/build copy/static/js/main.d4022087.js.map
DELETED
The diff for this file is too large to render.
See raw diff
|
|
FastAPI/app/build/asset-manifest.json
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
{
|
2 |
"files": {
|
3 |
-
"main.js": "/static/js/main.
|
4 |
"index.html": "/index.html",
|
5 |
-
"main.
|
6 |
},
|
7 |
"entrypoints": [
|
8 |
-
"static/js/main.
|
9 |
]
|
10 |
}
|
|
|
1 |
{
|
2 |
"files": {
|
3 |
+
"main.js": "/static/js/main.98763516.js",
|
4 |
"index.html": "/index.html",
|
5 |
+
"main.98763516.js.map": "/static/js/main.98763516.js.map"
|
6 |
},
|
7 |
"entrypoints": [
|
8 |
+
"static/js/main.98763516.js"
|
9 |
]
|
10 |
}
|
FastAPI/app/build/index.html
CHANGED
@@ -1 +1 @@
|
|
1 |
-
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>React App</title><script defer="defer" src="/static/js/main.
|
|
|
1 |
+
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>React App</title><script defer="defer" src="/static/js/main.98763516.js"></script></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|
FastAPI/app/build/static/js/main.98763516.js
ADDED
The diff for this file is too large to render.
See raw diff
|
|
FastAPI/app/build/static/js/main.98763516.js.LICENSE.txt
ADDED
@@ -0,0 +1,136 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*
|
2 |
+
* @copyright 2016 Sean Connelly (@voidqk), http://syntheti.cc
|
3 |
+
* @license MIT
|
4 |
+
* @preserve Project Home: https://github.com/voidqk/polybooljs
|
5 |
+
*/
|
6 |
+
|
7 |
+
/*
|
8 |
+
object-assign
|
9 |
+
(c) Sindre Sorhus
|
10 |
+
@license MIT
|
11 |
+
*/
|
12 |
+
|
13 |
+
/*
|
14 |
+
* @copyright 2016 Sean Connelly (@voidqk), http://syntheti.cc
|
15 |
+
* @license MIT
|
16 |
+
* @preserve Project Home: https://github.com/voidqk/polybooljs
|
17 |
+
*/
|
18 |
+
|
19 |
+
/*!
|
20 |
+
* The buffer module from node.js, for the browser.
|
21 |
+
*
|
22 |
+
* @author Feross Aboukhadijeh <https://feross.org>
|
23 |
+
* @license MIT
|
24 |
+
*/
|
25 |
+
|
26 |
+
/*!
|
27 |
+
* Determine if an object is a Buffer
|
28 |
+
*
|
29 |
+
* @author Feross Aboukhadijeh <https://feross.org>
|
30 |
+
* @license MIT
|
31 |
+
*/
|
32 |
+
|
33 |
+
/*!
|
34 |
+
* pad-left <https://github.com/jonschlinkert/pad-left>
|
35 |
+
*
|
36 |
+
* Copyright (c) 2014-2015, Jon Schlinkert.
|
37 |
+
* Licensed under the MIT license.
|
38 |
+
*/
|
39 |
+
|
40 |
+
/*!
|
41 |
+
* repeat-string <https://github.com/jonschlinkert/repeat-string>
|
42 |
+
*
|
43 |
+
* Copyright (c) 2014-2015, Jon Schlinkert.
|
44 |
+
* Licensed under the MIT License.
|
45 |
+
*/
|
46 |
+
|
47 |
+
/*!
|
48 |
+
* The buffer module from node.js, for the browser.
|
49 |
+
*
|
50 |
+
* @author Feross Aboukhadijeh <[email protected]> <http://feross.org>
|
51 |
+
* @license MIT
|
52 |
+
*/
|
53 |
+
|
54 |
+
/*!
|
55 |
+
* The buffer module from node.js, for the browser.
|
56 |
+
*
|
57 |
+
* @author Feross Aboukhadijeh <https://feross.org>
|
58 |
+
* @license MIT
|
59 |
+
*/
|
60 |
+
|
61 |
+
/*! Native Promise Only
|
62 |
+
v0.8.1 (c) Kyle Simpson
|
63 |
+
MIT License: http://getify.mit-license.org
|
64 |
+
*/
|
65 |
+
|
66 |
+
/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
67 |
+
|
68 |
+
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
69 |
+
|
70 |
+
/**
|
71 |
+
* @license React
|
72 |
+
* react-dom.production.min.js
|
73 |
+
*
|
74 |
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
75 |
+
*
|
76 |
+
* This source code is licensed under the MIT license found in the
|
77 |
+
* LICENSE file in the root directory of this source tree.
|
78 |
+
*/
|
79 |
+
|
80 |
+
/**
|
81 |
+
* @license React
|
82 |
+
* react-is.production.min.js
|
83 |
+
*
|
84 |
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
85 |
+
*
|
86 |
+
* This source code is licensed under the MIT license found in the
|
87 |
+
* LICENSE file in the root directory of this source tree.
|
88 |
+
*/
|
89 |
+
|
90 |
+
/**
|
91 |
+
* @license React
|
92 |
+
* react-jsx-runtime.production.min.js
|
93 |
+
*
|
94 |
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
95 |
+
*
|
96 |
+
* This source code is licensed under the MIT license found in the
|
97 |
+
* LICENSE file in the root directory of this source tree.
|
98 |
+
*/
|
99 |
+
|
100 |
+
/**
|
101 |
+
* @license React
|
102 |
+
* react.production.min.js
|
103 |
+
*
|
104 |
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
105 |
+
*
|
106 |
+
* This source code is licensed under the MIT license found in the
|
107 |
+
* LICENSE file in the root directory of this source tree.
|
108 |
+
*/
|
109 |
+
|
110 |
+
/**
|
111 |
+
* @license React
|
112 |
+
* scheduler.production.min.js
|
113 |
+
*
|
114 |
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
115 |
+
*
|
116 |
+
* This source code is licensed under the MIT license found in the
|
117 |
+
* LICENSE file in the root directory of this source tree.
|
118 |
+
*/
|
119 |
+
|
120 |
+
/** @license React v16.13.1
|
121 |
+
* react-is.production.min.js
|
122 |
+
*
|
123 |
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
124 |
+
*
|
125 |
+
* This source code is licensed under the MIT license found in the
|
126 |
+
* LICENSE file in the root directory of this source tree.
|
127 |
+
*/
|
128 |
+
|
129 |
+
/** @license React v17.0.2
|
130 |
+
* react-is.production.min.js
|
131 |
+
*
|
132 |
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
133 |
+
*
|
134 |
+
* This source code is licensed under the MIT license found in the
|
135 |
+
* LICENSE file in the root directory of this source tree.
|
136 |
+
*/
|
FastAPI/app/build/static/js/main.98763516.js.map
ADDED
The diff for this file is too large to render.
See raw diff
|
|
FastAPI/app/{build copy β build_copy_v1}/asset-manifest.json
RENAMED
@@ -1,10 +1,10 @@
|
|
1 |
{
|
2 |
"files": {
|
3 |
-
"main.js": "/static/js/main.
|
4 |
"index.html": "/index.html",
|
5 |
-
"main.
|
6 |
},
|
7 |
"entrypoints": [
|
8 |
-
"static/js/main.
|
9 |
]
|
10 |
}
|
|
|
1 |
{
|
2 |
"files": {
|
3 |
+
"main.js": "/static/js/main.e17bd3d9.js",
|
4 |
"index.html": "/index.html",
|
5 |
+
"main.e17bd3d9.js.map": "/static/js/main.e17bd3d9.js.map"
|
6 |
},
|
7 |
"entrypoints": [
|
8 |
+
"static/js/main.e17bd3d9.js"
|
9 |
]
|
10 |
}
|
FastAPI/app/{build copy β build_copy_v1}/favicon.ico
RENAMED
File without changes
|
FastAPI/app/{build copy β build_copy_v1}/index.html
RENAMED
@@ -1 +1 @@
|
|
1 |
-
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>React App</title><script defer="defer" src="/static/js/main.
|
|
|
1 |
+
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>React App</title><script defer="defer" src="/static/js/main.e17bd3d9.js"></script></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|
FastAPI/app/{build copy β build_copy_v1}/logo192.png
RENAMED
File without changes
|
FastAPI/app/{build copy β build_copy_v1}/logo512.png
RENAMED
File without changes
|
FastAPI/app/{build copy β build_copy_v1}/manifest.json
RENAMED
File without changes
|
FastAPI/app/{build copy β build_copy_v1}/robots.txt
RENAMED
File without changes
|
FastAPI/app/{build β build_copy_v1}/static/js/main.e17bd3d9.js
RENAMED
File without changes
|
FastAPI/app/{build β build_copy_v1}/static/js/main.e17bd3d9.js.LICENSE.txt
RENAMED
File without changes
|
FastAPI/app/{build β build_copy_v1}/static/js/main.e17bd3d9.js.map
RENAMED
File without changes
|
FastAPI/app/build_copy_v2/asset-manifest.json
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"files": {
|
3 |
+
"main.js": "/static/js/main.ed106e83.js",
|
4 |
+
"index.html": "/index.html",
|
5 |
+
"main.ed106e83.js.map": "/static/js/main.ed106e83.js.map"
|
6 |
+
},
|
7 |
+
"entrypoints": [
|
8 |
+
"static/js/main.ed106e83.js"
|
9 |
+
]
|
10 |
+
}
|
FastAPI/app/build_copy_v2/favicon.ico
ADDED
FastAPI/app/build_copy_v2/index.html
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>React App</title><script defer="defer" src="/static/js/main.ed106e83.js"></script></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|
FastAPI/app/build_copy_v2/logo192.png
ADDED
FastAPI/app/build_copy_v2/logo512.png
ADDED
FastAPI/app/build_copy_v2/manifest.json
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"short_name": "React App",
|
3 |
+
"name": "Create React App Sample",
|
4 |
+
"icons": [
|
5 |
+
{
|
6 |
+
"src": "favicon.ico",
|
7 |
+
"sizes": "64x64 32x32 24x24 16x16",
|
8 |
+
"type": "image/x-icon"
|
9 |
+
},
|
10 |
+
{
|
11 |
+
"src": "logo192.png",
|
12 |
+
"type": "image/png",
|
13 |
+
"sizes": "192x192"
|
14 |
+
},
|
15 |
+
{
|
16 |
+
"src": "logo512.png",
|
17 |
+
"type": "image/png",
|
18 |
+
"sizes": "512x512"
|
19 |
+
}
|
20 |
+
],
|
21 |
+
"start_url": ".",
|
22 |
+
"display": "standalone",
|
23 |
+
"theme_color": "#000000",
|
24 |
+
"background_color": "#ffffff"
|
25 |
+
}
|
FastAPI/app/build_copy_v2/robots.txt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
# https://www.robotstxt.org/robotstxt.html
|
2 |
+
User-agent: *
|
3 |
+
Disallow:
|
FastAPI/app/build_copy_v2/static/js/main.ed106e83.js
ADDED
The diff for this file is too large to render.
See raw diff
|
|
FastAPI/app/build_copy_v2/static/js/main.ed106e83.js.LICENSE.txt
ADDED
@@ -0,0 +1,121 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*
|
2 |
+
* @copyright 2016 Sean Connelly (@voidqk), http://syntheti.cc
|
3 |
+
* @license MIT
|
4 |
+
* @preserve Project Home: https://github.com/voidqk/polybooljs
|
5 |
+
*/
|
6 |
+
|
7 |
+
/*
|
8 |
+
object-assign
|
9 |
+
(c) Sindre Sorhus
|
10 |
+
@license MIT
|
11 |
+
*/
|
12 |
+
|
13 |
+
/*!
|
14 |
+
* The buffer module from node.js, for the browser.
|
15 |
+
*
|
16 |
+
* @author Feross Aboukhadijeh <https://feross.org>
|
17 |
+
* @license MIT
|
18 |
+
*/
|
19 |
+
|
20 |
+
/*!
|
21 |
+
* Determine if an object is a Buffer
|
22 |
+
*
|
23 |
+
* @author Feross Aboukhadijeh <https://feross.org>
|
24 |
+
* @license MIT
|
25 |
+
*/
|
26 |
+
|
27 |
+
/*!
|
28 |
+
* pad-left <https://github.com/jonschlinkert/pad-left>
|
29 |
+
*
|
30 |
+
* Copyright (c) 2014-2015, Jon Schlinkert.
|
31 |
+
* Licensed under the MIT license.
|
32 |
+
*/
|
33 |
+
|
34 |
+
/*!
|
35 |
+
* repeat-string <https://github.com/jonschlinkert/repeat-string>
|
36 |
+
*
|
37 |
+
* Copyright (c) 2014-2015, Jon Schlinkert.
|
38 |
+
* Licensed under the MIT License.
|
39 |
+
*/
|
40 |
+
|
41 |
+
/*!
|
42 |
+
* The buffer module from node.js, for the browser.
|
43 |
+
*
|
44 |
+
* @author Feross Aboukhadijeh <[email protected]> <http://feross.org>
|
45 |
+
* @license MIT
|
46 |
+
*/
|
47 |
+
|
48 |
+
/*!
|
49 |
+
* The buffer module from node.js, for the browser.
|
50 |
+
*
|
51 |
+
* @author Feross Aboukhadijeh <https://feross.org>
|
52 |
+
* @license MIT
|
53 |
+
*/
|
54 |
+
|
55 |
+
/*! Native Promise Only
|
56 |
+
v0.8.1 (c) Kyle Simpson
|
57 |
+
MIT License: http://getify.mit-license.org
|
58 |
+
*/
|
59 |
+
|
60 |
+
/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
61 |
+
|
62 |
+
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
63 |
+
|
64 |
+
/**
|
65 |
+
* @license React
|
66 |
+
* react-dom.production.min.js
|
67 |
+
*
|
68 |
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
69 |
+
*
|
70 |
+
* This source code is licensed under the MIT license found in the
|
71 |
+
* LICENSE file in the root directory of this source tree.
|
72 |
+
*/
|
73 |
+
|
74 |
+
/**
|
75 |
+
* @license React
|
76 |
+
* react-is.production.min.js
|
77 |
+
*
|
78 |
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
79 |
+
*
|
80 |
+
* This source code is licensed under the MIT license found in the
|
81 |
+
* LICENSE file in the root directory of this source tree.
|
82 |
+
*/
|
83 |
+
|
84 |
+
/**
|
85 |
+
* @license React
|
86 |
+
* react-jsx-runtime.production.min.js
|
87 |
+
*
|
88 |
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
89 |
+
*
|
90 |
+
* This source code is licensed under the MIT license found in the
|
91 |
+
* LICENSE file in the root directory of this source tree.
|
92 |
+
*/
|
93 |
+
|
94 |
+
/**
|
95 |
+
* @license React
|
96 |
+
* react.production.min.js
|
97 |
+
*
|
98 |
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
99 |
+
*
|
100 |
+
* This source code is licensed under the MIT license found in the
|
101 |
+
* LICENSE file in the root directory of this source tree.
|
102 |
+
*/
|
103 |
+
|
104 |
+
/**
|
105 |
+
* @license React
|
106 |
+
* scheduler.production.min.js
|
107 |
+
*
|
108 |
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
109 |
+
*
|
110 |
+
* This source code is licensed under the MIT license found in the
|
111 |
+
* LICENSE file in the root directory of this source tree.
|
112 |
+
*/
|
113 |
+
|
114 |
+
/** @license React v16.13.1
|
115 |
+
* react-is.production.min.js
|
116 |
+
*
|
117 |
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
118 |
+
*
|
119 |
+
* This source code is licensed under the MIT license found in the
|
120 |
+
* LICENSE file in the root directory of this source tree.
|
121 |
+
*/
|
FastAPI/app/build_copy_v2/static/js/main.ed106e83.js.map
ADDED
The diff for this file is too large to render.
See raw diff
|
|
FastAPI/app/utils/__pycache__/embedding.cpython-310.pyc
ADDED
Binary file (365 Bytes). View file
|
|
FastAPI/app/utils/embedding.py
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gensim.downloader
|
2 |
+
|
3 |
+
model = gensim.downloader.load("glove-wiki-gigaword-50")
|
4 |
+
|
5 |
+
|
6 |
+
def get_embedding(word):
|
7 |
+
global model
|
8 |
+
return model[word]
|
FastAPI/requirements.txt
CHANGED
@@ -1,3 +1,8 @@
|
|
1 |
uvicorn
|
2 |
fastapi
|
3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
1 |
uvicorn
|
2 |
fastapi
|
3 |
+
scipy==1.11.0
|
4 |
+
gensim
|
5 |
+
|
6 |
+
# gensim==4.0.1
|
7 |
+
# scipy==1.7.3
|
8 |
+
# numpy==1.19.5
|
FastAPI/test.ipynb
ADDED
@@ -0,0 +1,106 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 3,
|
6 |
+
"metadata": {},
|
7 |
+
"outputs": [],
|
8 |
+
"source": [
|
9 |
+
"import gensim.downloader\n",
|
10 |
+
"import numpy as np \n",
|
11 |
+
"import matplotlib.pyplot as plt"
|
12 |
+
]
|
13 |
+
},
|
14 |
+
{
|
15 |
+
"cell_type": "code",
|
16 |
+
"execution_count": 4,
|
17 |
+
"metadata": {},
|
18 |
+
"outputs": [],
|
19 |
+
"source": [
|
20 |
+
"model = gensim.downloader.load(\"glove-wiki-gigaword-50\")"
|
21 |
+
]
|
22 |
+
},
|
23 |
+
{
|
24 |
+
"cell_type": "code",
|
25 |
+
"execution_count": 5,
|
26 |
+
"metadata": {},
|
27 |
+
"outputs": [],
|
28 |
+
"source": [
|
29 |
+
"sushi_vector = model[\"sushi\"]\n",
|
30 |
+
"japanese_vector = model[\"japanese\"]"
|
31 |
+
]
|
32 |
+
},
|
33 |
+
{
|
34 |
+
"cell_type": "code",
|
35 |
+
"execution_count": null,
|
36 |
+
"metadata": {},
|
37 |
+
"outputs": [],
|
38 |
+
"source": [
|
39 |
+
"# select 3 first elements\n",
|
40 |
+
"sushi_vector = sushi_vector[:3]\n",
|
41 |
+
"japanese_vector = japanese_vector[:3]"
|
42 |
+
]
|
43 |
+
},
|
44 |
+
{
|
45 |
+
"cell_type": "code",
|
46 |
+
"execution_count": 6,
|
47 |
+
"metadata": {},
|
48 |
+
"outputs": [
|
49 |
+
{
|
50 |
+
"data": {
|
51 |
+
"text/plain": [
|
52 |
+
"Text(-0.3091900050640106, -0.35172998905181885, 'japanese')"
|
53 |
+
]
|
54 |
+
},
|
55 |
+
"execution_count": 6,
|
56 |
+
"metadata": {},
|
57 |
+
"output_type": "execute_result"
|
58 |
+
},
|
59 |
+
{
|
60 |
+
"data": {
|
61 |
+
"image/png": "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",
|
62 |
+
"text/plain": [
|
63 |
+
"<Figure size 640x480 with 1 Axes>"
|
64 |
+
]
|
65 |
+
},
|
66 |
+
"metadata": {},
|
67 |
+
"output_type": "display_data"
|
68 |
+
}
|
69 |
+
],
|
70 |
+
"source": [
|
71 |
+
"# create 3d plot with the 2 vecotrs\n",
|
72 |
+
"fig = plt.figure()\n",
|
73 |
+
"ax = fig.add_subplot(111, projection='3d')\n",
|
74 |
+
"\n",
|
75 |
+
"# plot the sushi vector\n",
|
76 |
+
"ax.quiver(0, 0, 0, sushi_vector[0], sushi_vector[1], sushi_vector[2], color='b')\n",
|
77 |
+
"ax.text(sushi_vector[0], sushi_vector[1], sushi_vector[2], \"sushi\", color='b')\n",
|
78 |
+
"\n",
|
79 |
+
"# plot the japanese vector\n",
|
80 |
+
"ax.quiver(0, 0, 0, japanese_vector[0], japanese_vector[1], japanese_vector[2], color='r')\n",
|
81 |
+
"ax.text(japanese_vector[0], japanese_vector[1], japanese_vector[2], \"japanese\", color='r')\n"
|
82 |
+
]
|
83 |
+
}
|
84 |
+
],
|
85 |
+
"metadata": {
|
86 |
+
"kernelspec": {
|
87 |
+
"display_name": "Python 3",
|
88 |
+
"language": "python",
|
89 |
+
"name": "python3"
|
90 |
+
},
|
91 |
+
"language_info": {
|
92 |
+
"codemirror_mode": {
|
93 |
+
"name": "ipython",
|
94 |
+
"version": 3
|
95 |
+
},
|
96 |
+
"file_extension": ".py",
|
97 |
+
"mimetype": "text/x-python",
|
98 |
+
"name": "python",
|
99 |
+
"nbconvert_exporter": "python",
|
100 |
+
"pygments_lexer": "ipython3",
|
101 |
+
"version": "3.10.12"
|
102 |
+
}
|
103 |
+
},
|
104 |
+
"nbformat": 4,
|
105 |
+
"nbformat_minor": 2
|
106 |
+
}
|
my-app/package-lock.json
CHANGED
The diff for this file is too large to render.
See raw diff
|
|
my-app/package.json
CHANGED
@@ -5,12 +5,15 @@
|
|
5 |
"dependencies": {
|
6 |
"@emotion/react": "^11.11.4",
|
7 |
"@emotion/styled": "^11.11.5",
|
8 |
-
"@mui/material": "^5.
|
|
|
9 |
"@testing-library/jest-dom": "^5.17.0",
|
10 |
"@testing-library/react": "^13.4.0",
|
11 |
"@testing-library/user-event": "^13.5.0",
|
|
|
12 |
"react": "^18.3.1",
|
13 |
"react-dom": "^18.3.1",
|
|
|
14 |
"react-scripts": "5.0.1",
|
15 |
"web-vitals": "^2.1.4"
|
16 |
},
|
|
|
5 |
"dependencies": {
|
6 |
"@emotion/react": "^11.11.4",
|
7 |
"@emotion/styled": "^11.11.5",
|
8 |
+
"@mui/icons-material": "^5.16.4",
|
9 |
+
"@mui/material": "^5.16.4",
|
10 |
"@testing-library/jest-dom": "^5.17.0",
|
11 |
"@testing-library/react": "^13.4.0",
|
12 |
"@testing-library/user-event": "^13.5.0",
|
13 |
+
"plotly.js": "^2.33.0",
|
14 |
"react": "^18.3.1",
|
15 |
"react-dom": "^18.3.1",
|
16 |
+
"react-plotly.js": "^2.6.0",
|
17 |
"react-scripts": "5.0.1",
|
18 |
"web-vitals": "^2.1.4"
|
19 |
},
|
my-app/src/App.js
DELETED
@@ -1,53 +0,0 @@
|
|
1 |
-
import React, { useState } from "react";
|
2 |
-
|
3 |
-
const App = () => {
|
4 |
-
const [wordOne, setWordOne] = useState("");
|
5 |
-
const [wordTwo, setWordTwo] = useState("");
|
6 |
-
const [message, setMessage] = useState("");
|
7 |
-
|
8 |
-
const onPressButton = () => {
|
9 |
-
// Construct the URL with query parameters
|
10 |
-
const url = `https://abadesalex-emb-rep.hf.space/api/sum_of_lengths?word1=${wordOne}&word2=${wordTwo}`;
|
11 |
-
// const url = `http://localhost:8000/api/sum_of_lengths?word1=${wordOne}&word2=${wordTwo}`;
|
12 |
-
|
13 |
-
fetch(url, {
|
14 |
-
method: "GET",
|
15 |
-
headers: {
|
16 |
-
"Content-Type": "application/json",
|
17 |
-
},
|
18 |
-
})
|
19 |
-
.then((response) => response.json())
|
20 |
-
.then((data) => {
|
21 |
-
if (data.sum !== undefined) {
|
22 |
-
setMessage(`Sum of lengths: ${data.sum}`);
|
23 |
-
} else {
|
24 |
-
setMessage("Error: Unexpected response");
|
25 |
-
}
|
26 |
-
})
|
27 |
-
.catch((error) => {
|
28 |
-
console.error("Error:", error);
|
29 |
-
setMessage("Error: Failed to fetch data");
|
30 |
-
});
|
31 |
-
};
|
32 |
-
|
33 |
-
return (
|
34 |
-
<div>
|
35 |
-
<input
|
36 |
-
type="text"
|
37 |
-
value={wordOne}
|
38 |
-
onChange={(e) => setWordOne(e.target.value)}
|
39 |
-
placeholder="First Word"
|
40 |
-
/>
|
41 |
-
<input
|
42 |
-
type="text"
|
43 |
-
value={wordTwo}
|
44 |
-
onChange={(e) => setWordTwo(e.target.value)}
|
45 |
-
placeholder="Second Word"
|
46 |
-
/>
|
47 |
-
<button onClick={onPressButton}>Submit</button>
|
48 |
-
<p>{message}</p>
|
49 |
-
</div>
|
50 |
-
);
|
51 |
-
};
|
52 |
-
|
53 |
-
export default App;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
my-app/src/Components/ActiveWords/index.jsx
ADDED
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { Grid, Typography } from "@mui/material";
|
2 |
+
import { useEffect, useState } from "react";
|
3 |
+
import { WordsContext } from "../Context/WordsContext";
|
4 |
+
import CreateWordEmbedding from "../CreateWord/CreateWord";
|
5 |
+
import WordCard from "../WordCard";
|
6 |
+
import EmbeddingPlot from "../Plot";
|
7 |
+
|
8 |
+
export default function ActiveWords() {
|
9 |
+
const [words, setWords] = useState([]);
|
10 |
+
// const [embedding, setEmbedding] = useState([]);
|
11 |
+
|
12 |
+
const fetchWords = async () => {
|
13 |
+
const response = await fetch("http://localhost:8000/api/words");
|
14 |
+
const wordsResponse = await response.json();
|
15 |
+
setWords(wordsResponse.data);
|
16 |
+
|
17 |
+
// console.log("response", wordsResponse.data);
|
18 |
+
// console.log("words", words);
|
19 |
+
|
20 |
+
};
|
21 |
+
|
22 |
+
const deleteWord = async (id) => {
|
23 |
+
await fetch(`http://localhost:8000/api/delete-word/${id}`, {
|
24 |
+
method: "DELETE",
|
25 |
+
headers: { "Content-Type": "application/json" },
|
26 |
+
});
|
27 |
+
await fetchWords();
|
28 |
+
};
|
29 |
+
|
30 |
+
useEffect(() => {
|
31 |
+
fetchWords();
|
32 |
+
}, []);
|
33 |
+
|
34 |
+
return (
|
35 |
+
<>
|
36 |
+
<WordsContext.Provider value={{ words, fetchWords }}>
|
37 |
+
<Grid container>
|
38 |
+
<Grid item xs={8} container direction={"column"}>
|
39 |
+
<Grid item>
|
40 |
+
<CreateWordEmbedding />
|
41 |
+
</Grid>
|
42 |
+
<Grid item>
|
43 |
+
<EmbeddingPlot words={words}/>
|
44 |
+
</Grid>
|
45 |
+
</Grid>
|
46 |
+
<Grid item xs={4}>
|
47 |
+
<Grid item>
|
48 |
+
<Typography variant={"h4"}>Active Words</Typography>
|
49 |
+
</Grid>
|
50 |
+
<Grid container direction={"column"} mt={2}>
|
51 |
+
{words.map((word) => (
|
52 |
+
<Grid item key={word.id} mb={1} mr={1}>
|
53 |
+
<WordCard
|
54 |
+
word={word.item}
|
55 |
+
id={word.id}
|
56 |
+
deleteWord={deleteWord}
|
57 |
+
/>
|
58 |
+
</Grid>
|
59 |
+
))}
|
60 |
+
</Grid>
|
61 |
+
</Grid>
|
62 |
+
</Grid>
|
63 |
+
</WordsContext.Provider>
|
64 |
+
</>
|
65 |
+
);
|
66 |
+
}
|
my-app/src/Components/Body/index.jsx
ADDED
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { Grid } from "@mui/material";
|
2 |
+
import ActiveWords from "../ActiveWords";
|
3 |
+
import CreateWordEmbedding from "../CreateWord/CreateWord";
|
4 |
+
import { WordsContext } from "../Context/WordsContext";
|
5 |
+
import { useEffect, useState } from "react";
|
6 |
+
|
7 |
+
export default function Body() {
|
8 |
+
const [words, setWords] = useState([]);
|
9 |
+
const fetchWords = async () => {
|
10 |
+
const response = await fetch("http://localhost:8000/api/words");
|
11 |
+
const words = await response.json();
|
12 |
+
setWords(words.data);
|
13 |
+
};
|
14 |
+
useEffect(() => {
|
15 |
+
fetchWords();
|
16 |
+
}, []);
|
17 |
+
return (
|
18 |
+
<>
|
19 |
+
<WordsContext.Provider value={{ words, fetchWords }}>
|
20 |
+
<Grid container mt={2} mr={2} ml={2} textAlign={"center"} spacing={2}>
|
21 |
+
<Grid item xs={9}>
|
22 |
+
<CreateWordEmbedding />
|
23 |
+
</Grid>
|
24 |
+
|
25 |
+
<Grid item xs={3}>
|
26 |
+
<ActiveWords />
|
27 |
+
</Grid>
|
28 |
+
</Grid>
|
29 |
+
</WordsContext.Provider>
|
30 |
+
</>
|
31 |
+
);
|
32 |
+
}
|
my-app/src/Components/Context/WordsContext.js
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { createContext } from "react";
|
2 |
+
|
3 |
+
export const WordsContext = createContext({
|
4 |
+
words: [],
|
5 |
+
fetchWords: () => {},
|
6 |
+
});
|
my-app/src/Components/CreateWord/CreateWord.jsx
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { Button, Grid, TextField } from "@mui/material";
|
2 |
+
import React, { useContext, useEffect, useState } from "react";
|
3 |
+
import { WordsContext } from "../Context/WordsContext";
|
4 |
+
|
5 |
+
const CreateWordEmbedding = () => {
|
6 |
+
const [wordOne, setWordOne] = useState("");
|
7 |
+
const { words, fetchWords } = useContext(WordsContext);
|
8 |
+
|
9 |
+
const onChangeWordOne = (event) => {
|
10 |
+
const newWordOne = event.target.value;
|
11 |
+
setWordOne(newWordOne);
|
12 |
+
};
|
13 |
+
|
14 |
+
const onPressButton = () => {
|
15 |
+
// const url = `https://abadesalex-emb-rep.hf.space/api/sum_of_lengths?word1=${wordOne}&word2=${wordTwo}`;
|
16 |
+
// const url = `http://localhost:8000/api/sum_of_lengths?word1=${wordOne}`;
|
17 |
+
const url2 = `http://localhost:8000/api/add-word`;
|
18 |
+
const newWord = {
|
19 |
+
id: words.length + 1,
|
20 |
+
item: wordOne,
|
21 |
+
};
|
22 |
+
|
23 |
+
fetch(url2, {
|
24 |
+
method: "POST",
|
25 |
+
headers: {
|
26 |
+
"Content-Type": "application/json",
|
27 |
+
},
|
28 |
+
body: JSON.stringify(newWord),
|
29 |
+
}).then(fetchWords);
|
30 |
+
};
|
31 |
+
|
32 |
+
useEffect(() => {
|
33 |
+
fetchWords();
|
34 |
+
}, []);
|
35 |
+
|
36 |
+
return (
|
37 |
+
<>
|
38 |
+
<Grid container textAlign={"center"} spacing={2}>
|
39 |
+
<Grid item xs={5}>
|
40 |
+
<TextField
|
41 |
+
id="word-one"
|
42 |
+
label="Word"
|
43 |
+
variant="outlined"
|
44 |
+
onChange={onChangeWordOne}
|
45 |
+
fullWidth
|
46 |
+
/>
|
47 |
+
</Grid>
|
48 |
+
|
49 |
+
<Grid item xs={5}>
|
50 |
+
<Button
|
51 |
+
variant="contained"
|
52 |
+
color="primary"
|
53 |
+
fullWidth
|
54 |
+
sx={{ height: "100%" }}
|
55 |
+
onClick={onPressButton}
|
56 |
+
>
|
57 |
+
Create Embedding
|
58 |
+
</Button>
|
59 |
+
</Grid>
|
60 |
+
</Grid>
|
61 |
+
</>
|
62 |
+
);
|
63 |
+
};
|
64 |
+
|
65 |
+
export default CreateWordEmbedding;
|
my-app/src/Components/Header/index.jsx
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { Grid } from "@mui/material";
|
2 |
+
|
3 |
+
|
4 |
+
export default function Intro() {
|
5 |
+
|
6 |
+
return (<>
|
7 |
+
<Grid>
|
8 |
+
<h1>Introduction</h1>
|
9 |
+
<p>
|
10 |
+
This is a simple web application that compares the similarity of two words using their word embeddings.
|
11 |
+
Word embeddings are numerical representations of words that capture their meanings.
|
12 |
+
This application uses the pre-trained word embeddings from the GloVe model, which is a popular word embedding model.
|
13 |
+
The similarity between two words is computed as the cosine similarity between their word embeddings.
|
14 |
+
The cosine similarity ranges from -1 to 1, where 1 indicates that the two words are similar, 0 indicates that they are orthogonal, and -1 indicates that they are dissimilar.
|
15 |
+
You can enter two words in the input fields below and click the "Compare Embedding" button to see the similarity between them.
|
16 |
+
</p>
|
17 |
+
</Grid>
|
18 |
+
</>);
|
19 |
+
}
|
my-app/src/Components/Plot/index.jsx
ADDED
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { type } from "@testing-library/user-event/dist/type";
|
2 |
+
import { name } from "plotly.js/lib/bar";
|
3 |
+
import React from "react";
|
4 |
+
import Plot from "react-plotly.js";
|
5 |
+
|
6 |
+
const colors = [
|
7 |
+
'red', 'blue', 'green', 'orange', 'purple', 'brown', 'pink', 'grey', 'yellow', 'cyan'
|
8 |
+
];
|
9 |
+
|
10 |
+
export default function EmbeddingPlot({ words }) {
|
11 |
+
return (
|
12 |
+
<Plot
|
13 |
+
data={[
|
14 |
+
...words.map((word, index) => {
|
15 |
+
const color = colors[index % colors.length];
|
16 |
+
return {
|
17 |
+
x: [0, word.embedding[0]],
|
18 |
+
y: [0, word.embedding[1]],
|
19 |
+
z: [0, word.embedding[2]],
|
20 |
+
type: "scatter3d",
|
21 |
+
mode: "lines+markers",
|
22 |
+
line: {
|
23 |
+
width: 6,
|
24 |
+
},
|
25 |
+
marker: {
|
26 |
+
size: 1,
|
27 |
+
color: color,
|
28 |
+
},
|
29 |
+
name: word.item,
|
30 |
+
};
|
31 |
+
}),
|
32 |
+
...words.map((word, index) => {
|
33 |
+
const color = colors[index % colors.length];
|
34 |
+
return {
|
35 |
+
type: "cone",
|
36 |
+
x: [word.embedding[0]],
|
37 |
+
y: [word.embedding[1]],
|
38 |
+
z: [word.embedding[2]],
|
39 |
+
u: [word.embedding[0]],
|
40 |
+
v: [word.embedding[1]],
|
41 |
+
w: [word.embedding[2]],
|
42 |
+
sizemode: "absolute",
|
43 |
+
sizeref: 0.05,
|
44 |
+
showscale: false,
|
45 |
+
colorscale: [[0, color], [1, color]],
|
46 |
+
};
|
47 |
+
}),
|
48 |
+
]}
|
49 |
+
layout={{
|
50 |
+
width: 800,
|
51 |
+
height: 600,
|
52 |
+
title: "3D Plot of Vectors",
|
53 |
+
scene: {
|
54 |
+
xaxis: { title: "X Axis" },
|
55 |
+
yaxis: { title: "Y Axis" },
|
56 |
+
zaxis: { title: "Z Axis" },
|
57 |
+
},
|
58 |
+
autosize: true,
|
59 |
+
}}
|
60 |
+
/>
|
61 |
+
);
|
62 |
+
}
|
my-app/src/Components/WordCard/index.jsx
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React from "react";
|
2 |
+
import { Grid, Typography, IconButton } from "@mui/material";
|
3 |
+
import CloseIcon from "@mui/icons-material/Close";
|
4 |
+
|
5 |
+
const WordCard = ({ word, id, deleteWord }) => {
|
6 |
+
return (
|
7 |
+
<Grid
|
8 |
+
container
|
9 |
+
alignItems="center"
|
10 |
+
justifyContent="space-between"
|
11 |
+
borderRadius={2}
|
12 |
+
border={1}
|
13 |
+
>
|
14 |
+
<Grid item>
|
15 |
+
<Typography margin={1}>{word}</Typography>
|
16 |
+
</Grid>
|
17 |
+
<Grid item>
|
18 |
+
<IconButton onClick={() => deleteWord(id)}>
|
19 |
+
<CloseIcon />
|
20 |
+
</IconButton>
|
21 |
+
</Grid>
|
22 |
+
</Grid>
|
23 |
+
);
|
24 |
+
};
|
25 |
+
|
26 |
+
export default WordCard;
|
my-app/src/index.js
CHANGED
@@ -1,13 +1,17 @@
|
|
1 |
-
import React from
|
2 |
-
import ReactDOM from
|
3 |
-
import
|
|
|
|
|
|
|
|
|
|
|
4 |
|
5 |
-
|
6 |
-
const root = ReactDOM.createRoot(document.getElementById('root'));
|
7 |
root.render(
|
8 |
<React.StrictMode>
|
9 |
-
<
|
|
|
|
|
10 |
</React.StrictMode>
|
11 |
);
|
12 |
-
|
13 |
-
|
|
|
1 |
+
import React from "react";
|
2 |
+
import ReactDOM from "react-dom/client";
|
3 |
+
import CreateWordEmbedding from "./Components/CreateWord/CreateWord";
|
4 |
+
import EmbeddingPlot from "./Components/Plot";
|
5 |
+
import Intro from "./Components/Header";
|
6 |
+
import WordCard from "./Components/WordCard";
|
7 |
+
import ActiveWords from "./Components/ActiveWords";
|
8 |
+
import Body from "./Components/Body";
|
9 |
|
10 |
+
const root = ReactDOM.createRoot(document.getElementById("root"));
|
|
|
11 |
root.render(
|
12 |
<React.StrictMode>
|
13 |
+
<Intro />
|
14 |
+
<ActiveWords />
|
15 |
+
|
16 |
</React.StrictMode>
|
17 |
);
|
|
|
|
my-app/testPlot.jsx
ADDED
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React from 'react';
|
2 |
+
import Plot from 'react-plotly.js';
|
3 |
+
|
4 |
+
export default function EmbeddingPlot({words}) {
|
5 |
+
const vector1 = [2, 4, 5];
|
6 |
+
const vector2 = [-1, 3, 4];
|
7 |
+
|
8 |
+
return (
|
9 |
+
<Plot
|
10 |
+
data={[
|
11 |
+
{
|
12 |
+
// Vector path
|
13 |
+
x: [0, 2], // Start at origin and end at (2, -1, 0)
|
14 |
+
y: [0, -1],
|
15 |
+
z: [0, 0],
|
16 |
+
type: "scatter3d",
|
17 |
+
mode: "lines+markers",
|
18 |
+
line: {
|
19 |
+
width: 6, // Line width
|
20 |
+
color: "red",
|
21 |
+
},
|
22 |
+
marker: {
|
23 |
+
size: 5,
|
24 |
+
color: "red",
|
25 |
+
},
|
26 |
+
},
|
27 |
+
{
|
28 |
+
// Cone at the end of the vector
|
29 |
+
type: "cone",
|
30 |
+
x: [2], // Position of the cone
|
31 |
+
y: [-1],
|
32 |
+
z: [0],
|
33 |
+
u: [2], // Direction of the cone
|
34 |
+
v: [-1],
|
35 |
+
w: [0],
|
36 |
+
sizemode: "absolute",
|
37 |
+
sizeref: 0.2,
|
38 |
+
showscale: false,
|
39 |
+
color: "red",
|
40 |
+
},
|
41 |
+
{
|
42 |
+
// Vector path
|
43 |
+
x: [0, -2], // Start at origin and end at (-2, 1, 0)
|
44 |
+
y: [0, 1],
|
45 |
+
z: [0, 0],
|
46 |
+
type: "scatter3d",
|
47 |
+
mode: "lines+markers",
|
48 |
+
line: {
|
49 |
+
width: 6, // Line width
|
50 |
+
color: "blue",
|
51 |
+
},
|
52 |
+
marker: {
|
53 |
+
size: 5,
|
54 |
+
color: "blue",
|
55 |
+
},
|
56 |
+
},
|
57 |
+
{
|
58 |
+
// Cone at the end of the vector
|
59 |
+
type: "cone",
|
60 |
+
x: [-2], // Position of the cone
|
61 |
+
y: [1],
|
62 |
+
z: [0],
|
63 |
+
u: [-2], // Direction of the cone
|
64 |
+
v: [1],
|
65 |
+
w: [0],
|
66 |
+
sizemode: "absolute",
|
67 |
+
sizeref: 0.2,
|
68 |
+
showscale: false,
|
69 |
+
color: "blue",
|
70 |
+
},
|
71 |
+
]}
|
72 |
+
|
73 |
+
layout={{
|
74 |
+
width: 400,
|
75 |
+
height: 400,
|
76 |
+
title: "3D Plot of Vectors",
|
77 |
+
scene: {
|
78 |
+
xaxis: { title: "X Axis" },
|
79 |
+
yaxis: { title: "Y Axis" },
|
80 |
+
zaxis: { title: "Z Axis" },
|
81 |
+
},
|
82 |
+
autosize: true,
|
83 |
+
}}
|
84 |
+
/>
|
85 |
+
);
|
86 |
+
};
|
87 |
+
|
88 |
+
|
prev.tsx
CHANGED
@@ -72,3 +72,21 @@ function App() {
|
|
72 |
}
|
73 |
|
74 |
export default App;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
72 |
}
|
73 |
|
74 |
export default App;
|
75 |
+
|
76 |
+
|
77 |
+
<div>
|
78 |
+
<input
|
79 |
+
type="text"
|
80 |
+
value={wordOne}
|
81 |
+
onChange={onChangeWordOne}
|
82 |
+
placeholder="First Word"
|
83 |
+
/>
|
84 |
+
<input
|
85 |
+
type="text"
|
86 |
+
value={wordTwo}
|
87 |
+
onChange={onChangeWordTwo}
|
88 |
+
placeholder="Second Word"
|
89 |
+
/>
|
90 |
+
<button onClick={onPressButton}>Submit</button>
|
91 |
+
<p>{message}</p>
|
92 |
+
</div>
|