2022-05-14:语法补全功能,比如"as soon as possible",
当我们识别到"as soon as"时, 基本即可判定用户需要键入"possible"。
设计一个统计词频的模型,用于这个功能,
类似(prefix, next word)这样的二元组,
比如一个上面的句子"as soon as possible",
有产生如下的二元组(as, soon, 1)、(as soon, as, 1)、(as soon as, possible, 1)。
意思是这一个句子产生了如下的统计:
当前缀为"as",接下来的单词是"soon",有了1个期望点;
当前缀为"as soon",接下来的单词是"as",有了1个期望点;
当前缀为"as soon as",接下来的单词是"possible",有了1个期望点。
那么如果给你很多的句子,当然就可以产生很多的期望点,同一个前缀下,同一个next word的期望点可以累加。
现在给你n个句子,让你来建立统计,
然后给你m个句子,作为查询,
最后给你k,表示每个句子作为前缀的情况下,词频排在前k名的联想。
返回m个结果,每个结果最多k个单词。
来自字节飞书团队。

答案2022-05-14:

前缀树。本来想用rust编写,但实力有限,实在写不出。所以用go语言了。

代码用golang编写。代码如下:

package main

import (
"fmt"
"sort"
"strings"
) func main() {
sentences := []string{"i think you are good", "i think you are fine", "i think you are good man"}
k := 2
ai := NewAI(sentences, k)
for _, ans := range ai.suggest("i think you are") {
fmt.Println(ans)
}
fmt.Println("=====")
ai.fill("i think you are fucking good")
ai.fill("i think you are fucking great")
ai.fill("i think you are fucking genius")
for _, ans := range ai.suggest("i think you are") {
fmt.Println(ans)
}
fmt.Println("=====")
} type TrieNode struct {
word string
times int
nextNodes map[string]*TrieNode
nextRanks []*TrieNode
} func NewTrieNode(w string) *TrieNode {
ans := &TrieNode{}
ans.word = w
ans.times = 1
ans.nextNodes = make(map[string]*TrieNode)
ans.nextRanks = make([]*TrieNode, 0)
return ans
} type AI struct {
root *TrieNode
topk int
} func NewAI(sentences []string, k int) *AI {
ans := &AI{}
ans.root = NewTrieNode("")
ans.topk = k
for _, sentence := range sentences {
ans.fill(sentence)
}
return ans
} func (this *AI) fill(sentence string) {
cur := this.root
var next *TrieNode
for _, word := range strings.Split(sentence, " ") {
if _, ok := cur.nextNodes[word]; !ok {
next = NewTrieNode(word)
cur.nextNodes[word] = next
cur.nextRanks = append(cur.nextRanks, next)
} else {
next = cur.nextNodes[word]
next.times++
}
cur = next
}
} func (this *AI) suggest(sentence string) []string {
ans := make([]string, 0)
cur := this.root
for _, word := range strings.Split(sentence, " ") {
if _, ok := cur.nextNodes[word]; !ok {
return ans
} else {
cur = cur.nextNodes[word]
}
}
sort.Slice(cur.nextRanks, func(i, j int) bool {
a := cur.nextRanks[i]
b := cur.nextRanks[j]
if a.times != b.times {
return a.times > b.times
} else {
return a.word < b.word
}
})
for _, n := range cur.nextRanks {
ans = append(ans, n.word)
if len(ans) == this.topk {
break
}
}
return ans
}

执行结果如下:


左神java代码

2022-05-14:语法补全功能,比如“as soon as possible“, 当我们识别到“as soon as“时, 基本即可判定用户需要键入“possible“。 设计一个统计词频的模型,的更多相关文章

  1. 记一个同时支持模糊匹配和静态推导的Atom语法补全插件的开发过程: 序

    简介 过去的一周,都睡的很晚,终于做出了Atom上的APICloud语法提示与补全插件:apicloud_autocomplete.个中滋味,感觉还是有必要记录下来的.代码基于 GPL-3.0 开源, ...

  2. jquery的输入框自动补全功能+ajax

    jquery的输入框自动补全功能+ajax 2017年05月10日 18:51:39 辣姐什么鬼 阅读数:1461 标签: web前端 更多 个人分类: web前端   内容参考网友文章写成,原博的链 ...

  3. linux-python在vim下的自动补全功能

    linux-python在vim下的自动补全功能 安装配置: wget https://github.com/rkulla/pydiction/archive/master.zipunzip -q m ...

  4. Python中tab键自动补全功能的配置

    新手学习Python的时候,如何没有tab键补全功能,我感觉那将是一个噩梦,对于我们这种菜鸟来说,刚接触python,对一切都不了解,还好有前辈们的指导,学习一下,并记录下来,还没有学习这个功能小伙伴 ...

  5. vue中实现中,自动补全功能

    知识点:利用vue的基本语法实现,自动补全功能 参考博客:https://www.jb51.net/article/136282.htm 效果:在文本框中,输入相关名称,调用后台接口,将数据填充到下拉 ...

  6. Python-2.7 配置 tab 自动补全功能

    作者博文地址:http://www.cnblogs.com/liu-shuai/ 之前一直使用shell编程,习惯了shell的 tab 自动补全功能,而Python的命令行却不支持 tab 自动补全 ...

  7. 让centos使用ubuntu的make命令补全功能

    一直习惯使用debian.ubuntu做开发机,最近it要求各种安全加固,且只提供centos自动化脚本,而ubuntu版本比较乱,14.16.17都要自己整一遍太麻烦,索性换装centos7. 换了 ...

  8. gocode+auto-complete搭建emacs的go语言自动补全功能

    上篇随笔记录了在emacs中使用go-mode和goflymake搭建了go语言的简单编程环境(推送门),今天来记录一下使用gocode+auto-complete配置emacs中go语言的自动补全功 ...

  9. notepad++代码自动补全功能

    可以代码自动补全功能,默认他是没有开启这个功能的,在首选项->备份与自动完成 里面有自动完成这一个设置,可以设置单词补全,也可以设置函数补全,这样写代码就快多了

  10. Eclipse自动补全功能和自动生成作者、日期注释等功能设置

    修改作者.日期注释格式:打开Windows->Preferences->Java->Code Style->Code Templates,点击右边窗口中的Comments,可以 ...

随机推荐

  1. SDK测试标准

    测试分类 具体测试项 测试内容 测试方法 文档测试 接口清单 接口清单是否完整,正确,包含提供给开发者的协议所有字段的定义和解释 人工检查 更新说明 要说明新增,删除的接口定义 Demo示例 显示如何 ...

  2. Markdown操作方法

    Markdown学习 标题 三级标题 四级标题 字体 原本 hello,world! 斜体 hello,world! 加粗 hello,world! 斜体加粗 hello,world! 删除 hell ...

  3. SqlServer获取一周内每天的金额统计数据

    select datename(weekday,CAST([CompletedTime] AS date)) WeekNum, CAST([CompletedTime] AS date) AS 'Da ...

  4. Java8-聚合操作

    Java聚合操作(Aggregate Operations)是对一堆数据进行处理的新的操作方法,我们知道,如果想对一堆数据进行处理,比如一个List对象中的数据进行处理,传统的操作就是遍历List数据 ...

  5. Thinkpad键盘操作手册与驱动 thinkpad蓝牙键盘KT-1525 manual

    thinklife mechanical keyboard tk500_win10.exe https://pan.baidu.com/s/1pQM3RcgV-phugew6vcKDLw

  6. pytorch CrossEntropyLoss() 默认转换one-hot编码

    import torchpredict = torch.randn((4,3))predict = torch.nn.functional.softmax(predict,dim = 1)target ...

  7. CSS必知必会

    CSS概念 css的使用是让网页具有统一美观的页面,css层叠样式表,简称样式表,文件后缀名.css css的规则由两部分构成:选择器以及一条或者多条声明 选择器:通常是需要改变的HTML元素 声明: ...

  8. Cesium 后处理(Post Process)

    原文地址:https://blog.csdn.net/ls870061011/article/details/123910821 作者:GIS李胜 为实现三维模型的更炫.更酷.更美观,Cesium在1 ...

  9. 易基因:PIWI/piRNA在人癌症中的表观遗传调控机制(DNA甲基化+m6A+组蛋白修饰)|综述

    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因. 2023年03月07日,南华大学衡阳医学院李二毛团队在<Molecular Cancer>杂志发表了题为"The ...

  10. 父组件传值给子组件时 ,watch props 监听不到解决方案

    watch:{ data:{ immediate:true, handler:function(){ } } }