Browse Source

Add GetWordsetMatch() API.

HEAD
Yang Luo 3 years ago
parent
commit
94658e0041
11 changed files with 67 additions and 77 deletions
  1. +7
    -0
      controllers/wordset.go
  2. +2
    -1
      object/vectorset.go
  3. +7
    -6
      object/vectorset_upload.go
  4. +26
    -0
      object/wordset_match.go
  5. +0
    -63
      object/wordset_upload.go
  6. +0
    -7
      object/wordset_upload_test.go
  7. +1
    -0
      routers/router.go
  8. +15
    -0
      web/src/WordsetEditPage.js
  9. +7
    -0
      web/src/backend/WordsetBackend.js
  10. +1
    -0
      web/src/locales/en/data.json
  11. +1
    -0
      web/src/locales/zh/data.json

+ 7
- 0
controllers/wordset.go View File

@@ -35,6 +35,13 @@ func (c *ApiController) GetWordsetGraph() {
c.ServeJSON()
}

func (c *ApiController) GetWordsetMatch() {
id := c.Input().Get("id")

c.Data["json"] = object.GetWordsetMatch(id)
c.ServeJSON()
}

func (c *ApiController) UpdateWordset() {
id := c.Input().Get("id")



+ 2
- 1
object/vectorset.go View File

@@ -19,7 +19,8 @@ type Vectorset struct {
Dimension int `json:"dimension"`
Count int `json:"count"`

Vectors []*Vector `xorm:"mediumtext" json:"vectors"`
Vectors []*Vector `xorm:"mediumtext" json:"vectors"`
VectorMap map[string]*Vector `xorm:"-" json:"vectorMap"`
}

func GetGlobalVectorsets() []*Vectorset {


+ 7
- 6
object/vectorset_upload.go View File

@@ -19,18 +19,19 @@ func (vectorset *Vectorset) LoadVectors(pathPrefix string) {
}

exampleVectors := []*Vector{}
for i := 0; i < 100; i++ {
if i >= len(nameArray) {
break
}

vectorMap := map[string]*Vector{}
for i := 0; i < len(nameArray); i++ {
vector := &Vector{
Name: nameArray[i],
Data: dataArray[i],
}

exampleVectors = append(exampleVectors, vector)
if i < 100 {
exampleVectors = append(exampleVectors, vector)
}
vectorMap[vector.Name] = vector
}

vectorset.Vectors = exampleVectors
vectorset.VectorMap = vectorMap
}

+ 26
- 0
object/wordset_match.go View File

@@ -0,0 +1,26 @@
package object

func GetWordsetMatch(id string) *Wordset {
wordset := GetWordset(id)
if wordset == nil {
return nil
}

vectorset := getVectorset(wordset.Owner, wordset.Vectorset)
if vectorset == nil {
return nil
}

vectorset.LoadVectors("")

for _, vector := range wordset.Vectors {
if trueVector, ok := vectorset.VectorMap[vector.Name]; ok {
vector.Data = trueVector.Data
} else {
vector.Data = []float64{}
}
}

UpdateWordset(wordset.GetId(), wordset)
return wordset
}

+ 0
- 63
object/wordset_upload.go View File

@@ -1,9 +1,6 @@
package object

import (
"fmt"
"strings"

"github.com/casbin/casbase/util"
"github.com/casbin/casbase/xlsx"
)
@@ -30,63 +27,3 @@ func uploadVectorNames(owner string, fileId string) bool {
}
return AddWordset(wordset)
}

func parseVectorData(s string) []float64 {
s = strings.TrimLeft(s, "[")
s = strings.TrimRight(s, "]")
s = strings.ReplaceAll(s, "\n", "")

tokens := strings.Split(s, " ")
res := []float64{}
for _, token := range tokens {
if token == "" {
continue
}

f := util.ParseFloat(token)
res = append(res, f)
}
return res
}

func readVectorData(fileId string) []*Vector {
path := util.GetUploadCsvPath(fileId)

rows := [][]string{}
util.LoadCsvFile(path, &rows)

vectors := []*Vector{}
for _, row := range rows {
if row[0] == "" {
continue
}

vector := &Vector{
Name: row[1],
Data: parseVectorData(row[2]),
}
if len(vector.Data) != 128 {
panic(fmt.Errorf("invalid vector data length: %d, vector = %v", len(vector.Data), vector))
}

vectors = append(vectors, vector)
}
return vectors
}

func updateWordsetVectors(owner string, wordsetName string, vectors []*Vector) {
wordset := getWordset(owner, wordsetName)

vectorMap := map[string]*Vector{}
for _, v := range wordset.Vectors {
vectorMap[v.Name] = v
}

for _, vector := range vectors {
if v, ok := vectorMap[vector.Name]; ok {
v.Data = vector.Data
}
}

UpdateWordset(wordset.GetId(), wordset)
}

+ 0
- 7
object/wordset_upload_test.go View File

@@ -7,10 +7,3 @@ func TestUploadVectorNames(t *testing.T) {

uploadVectorNames("admin", "../../tmpFiles/filename")
}

func TestUpdateWordsetVectors(t *testing.T) {
InitConfig()

vectors := readVectorData("../../tmpFiles/wordVector_utf-8")
updateWordsetVectors("admin", "word", vectors)
}

+ 1
- 0
routers/router.go View File

@@ -26,6 +26,7 @@ func initAPI() {
beego.Router("/api/get-wordsets", &controllers.ApiController{}, "GET:GetWordsets")
beego.Router("/api/get-wordset", &controllers.ApiController{}, "GET:GetWordset")
beego.Router("/api/get-wordset-graph", &controllers.ApiController{}, "GET:GetWordsetGraph")
beego.Router("/api/get-wordset-match", &controllers.ApiController{}, "GET:GetWordsetMatch")
beego.Router("/api/update-wordset", &controllers.ApiController{}, "POST:UpdateWordset")
beego.Router("/api/add-wordset", &controllers.ApiController{}, "POST:AddWordset")
beego.Router("/api/delete-wordset", &controllers.ApiController{}, "POST:DeleteWordset")


+ 15
- 0
web/src/WordsetEditPage.js View File

@@ -103,6 +103,21 @@ class WordsetEditPage extends React.Component {
</Select>
</Col>
</Row>
<Row style={{marginTop: '20px'}} >
<Col style={{marginTop: '5px'}} span={(Setting.isMobile()) ? 22 : 2}>
{i18next.t("wordset:Match")}:
</Col>
<Col span={22} >
<Button type="primary" onClick={() => {
WordsetBackend.getWordsetMatch(this.props.account.name, this.state.wordsetName)
.then((wordset) => {
this.setState({
wordset: wordset,
});
});
}}>{i18next.t("wordset:Match")}</Button>
</Col>
</Row>
<Row style={{marginTop: '20px'}} >
<Col style={{marginTop: '5px'}} span={(Setting.isMobile()) ? 22 : 2}>
{i18next.t("wordset:Matched")}:


+ 7
- 0
web/src/backend/WordsetBackend.js View File

@@ -28,6 +28,13 @@ export function getWordsetGraph(owner, name, clusterNumber, distanceLimit) {
}).then(res => res.json());
}
export function getWordsetMatch(owner, name) {
return fetch(`${Setting.ServerUrl}/api/get-wordset-match?id=${owner}/${encodeURIComponent(name)}`, {
method: "GET",
credentials: "include"
}).then(res => res.json());
}
export function updateWordset(owner, name, wordset) {
let newWordset = Setting.deepCopy(wordset);
return fetch(`${Setting.ServerUrl}/api/update-wordset?id=${owner}/${encodeURIComponent(name)}`, {


+ 1
- 0
web/src/locales/en/data.json View File

@@ -35,6 +35,7 @@
"All words": "All words",
"Distance": "Distance",
"Edit Wordset": "Edit Wordset",
"Match": "Match",
"Matched": "Matched",
"Valid words": "Valid words",
"Vectorset": "Vectorset",


+ 1
- 0
web/src/locales/zh/data.json View File

@@ -35,6 +35,7 @@
"All words": "所有词汇",
"Distance": "距离",
"Edit Wordset": "编辑词汇集",
"Match": "匹配",
"Matched": "匹配度",
"Valid words": "有效词汇",
"Vectorset": "向量集",


Loading…
Cancel
Save