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. Serverless 架构演进与实践

    Serverless 架构演进与实践 1. 介绍 Serverless 并不仅仅是一个概念,很多地方都已经有了它的影子和思想,本文将给大家介绍最近比较火的 Serverless. 首先放出官方对 Se ...

  2. Spring源码分析之注册BeanDefinition

    测试代码 public class ContextApplication { public static void main(String[] args) { ClassPathXmlApplicat ...

  3. 【读书笔记】Nice Families Of GF

    目录 Nice Families Of GF rational rational algebraic D-finite总览 下定义 逻辑关系 例子 更多的例子和判别法 运算是否有性质? 运算是否有性质 ...

  4. find和filter有什么区别

    JavaScript 在 ES6 上有很多数组方法,每种方法都有独特的用途和好处. 在开发应用程序时,大多使用数组方法来获取特定的值列表并获取单个或多个匹配项. 在列出这两种方法的区别之前,我们先来一 ...

  5. linux使用汇总

    linux使用汇总 Linux的目录结构 没有逻辑磁盘分区(C盘.D盘...) 是一棵树形结构,根目录是/ 根目录下边有几个文件夹,需要我们了解: /etc:配置文件所在的文件夹.比如:安装JDK,配 ...

  6. GUI编程--3 Swing

    GUI编程-3 Swing 3.1 JFrame 窗口 窗口: package com.ssl.lesson04; import javax.swing.*; import java.awt.*; p ...

  7. Docke 使用与详解1 --Tomcat

    一.Docker容器案例使用 --Tomcat安装与使用 1.Tomcat 安装 --docker tomcat镜像官网 1>使用docker pull tomcat拉取镜像,默认拉取最新版本: ...

  8. 设计模式-用代理模式(Proxy Pattern)来拯救你的代码:打造可靠的程序设计

    前言 设计模式是一种高级编程技巧,也是一种通用的解决方案.它能在不同的应用场景中使用,它可以提高代码的可读性.可复用性和可维护性.设计模式的学习能提高我们的编程能力以及代码质量,同时也能提高我们的开发 ...

  9. 基于express、node与mongodb写后端接口

    1.首先运行mongodb,建立一个数据库.(前提是你的电脑已经装了mongodb) 先打开一个命令窗口打开mongodb cd /usr/localcd mongodb/bin./mongod -- ...

  10. 长达 1.7 万字的 explain 关键字指南!

    当你的数据里只有几千几万,那么 SQL 优化并不会发挥太大价值,但当你的数据里去到了几百上千万,SQL 优化的价值就体现出来了!因此稍微有些经验的同学都知道,怎么让 MySQL 查询语句又快又好是一件 ...