MySQL 中存储的词组,比如:yellow wall,little cat,brown cat 、yellow dog 、coffee cup 之类的完全不同的词组总共 100W 行,现在给出一个句子,比如:“a little cat is sleeping behind a yellow wall with a yellow dog”,怎样以最快速度提取出这个 100W 词组中存在的词组:yellow wall,little cat 、yellow dog
MySQL 中存储的词组,比如:yellow wall,little cat,brown cat 、yellow dog 、coffee cup 之类的完全不同的词组总共 100W 行,现在给出一个句子,比如:“a little cat is sleeping behind a yellow wall with a yellow dog”,怎样以最快速度提取出这个 100W 词组中存在的词组:yellow wall,little cat 、yellow dog
|
wangkun025Aug 6, 2020
1
预处理好。
|
|
yrjAug 6, 2020 via iPad
2
全文检索?
|
|
bestsanmaoAug 6, 2020
3
select 字段名 from 表名 where instr('你的句子', 字段名)<>0
|
|
err1yAug 6, 2020 via iPhone
4
jieba 分词
|
|
PhilCAug 6, 2020
5
先分词呗
|
|
hboliveAug 6, 2020
6
上分词系统比较好,这么直接 mysql 查没搞过。。
|
|
iblislsyAug 6, 2020
7
把 100w 个词组添加到 jieba 的分词 dict,python 分词完直接用 counter 统计。
|
|
lithbitrenAug 6, 2020
8
分词哈希,前缀树都可以,100W 个词读进内存也没多少,成熟的轮子也时一沓一沓的
|
|
9
经典的倒排索引使用场景
|
|
sadfQED2Aug 6, 2020 via Android
10
分词,上 es,mysql 或许不行吧? mysql 能改分词器吗
|
|
zxcvshAug 6, 2020 via iPhone
11
试试 ES 吧,如果场景合适的话
|
|
rockyou12Aug 6, 2020
12
mysql 原生做不到
|
|
ic2yAug 6, 2020
13
100 万条词组,首先向量化,例如 yellow wall,可以标记为 [1,2] 1 表示 yellow,2 表示 wall
以此类推,little cat,可以标记为 [1, 3] 3 表示 cat 。 100 万条 向量化的词组,就是 100 万条 整形数组的序列,把这个序列变成 一个字典前缀树。 Node{ int value; Map<Interget,Node> childs; } 这棵树,在 100 万的量级,应该不大。都是整形的。保存在内存中。 遇到 a little cat is sleeping behind 就向量化,变成 23 45 18 1 4 之类的数字, 从 23 开始,依次从字典前缀树的 root,开始匹配,是否能匹配到叶子节点。如果匹配到,就输出。 否则,继续匹配 45 、18 等。 |
|
leapV3Aug 6, 2020
14
先分词 再查询
|
|
TimePPTAug 6, 2020
15
|
|
wjhjd163Aug 6, 2020 via Android
16
同上,倒排索引
直接查询还想要高速是肯定不可能的,这个结构还需要变化才行 如果数据少那直接分词后搜索即可 |
|
freelancherAug 6, 2020
17
我的原始思路是先分词。然后第一个词,一个个字母去对。
O 了。这个是算法题吧。应该有解的。 |
|
oscerAug 6, 2020
18
ES
|
|
lau52yAug 6, 2020 via iPhone
19
es 最合适了吧
|
|
RJHAug 6, 2020
20
何苦这样迫害 mysql 呢,人家原生就不是用来搞全文检索的,有 ES 不香吗?
|
|
arelessAug 6, 2020 via Android
21
MySQL 估计做不到。。。在内存里搞一棵庞大的 trie 树,跟 ES 速度就差不多了。就是有点废内存~
|
|
xcstreamAug 6, 2020
22
做一个键值对的表
key | value yellow | yellow wall, yellow xxx,yellow xxxxxx 然后分成一个一个单词 看到 yellow 就去找这个表 方法就是怎么样 用什么数据库还是内存 都可以 |
|
gleportAug 6, 2020
23
适合用字典树来实现。把这 100 万个词组从 MySQL 读出存进一棵字典树里,不会消耗多大内存。
一百多行左右的核心代码就可以完成了: ```go package main import ( "fmt" "github.com/hmgle/trie-x/go/trie" ) func main() { t := trie.New() t.Insert("yellow wall", 1) t.Insert("little cat", 1) t.Insert("brown cat", 1) t.Insert("yellow dog", 1) t.Insert("coffee cup", 1) content := "a little cat is sleeping behind a yellow wall with a yellow dog" hits := t.ScanContent(content) for _, hit := range hits { fmt.Printf("word: %s, offset: %d\n", hit.Word, hit.Offset) } } ``` 输出: ``` word: little cat, offset: 2 word: yellow wall, offset: 34 word: yellow dog, offset: 53 ``` |
|
24
100 w 好像不多直接放内存,AC 自动机,速度应该不会慢
|
|
rocky55Aug 6, 2020
25
100 w 前缀树的方式存储应该也不会太占内存,如果词不是很长,如果是英文应该就更省了
|
|
iyangyuanAug 6, 2020 via iPhone
26
分词,倒排
|
|
xupefeiAug 6, 2020 via iPhone
27
Boyer-Moore algorithm
|
|
chihiro2014Aug 6, 2020
29
倒排索引,Radix 之类的
|
|
gladuoAug 6, 2020
30
100w AC 自动机还可以,100-200M 空间
|
|
wangyzjAug 7, 2020
31
mysql 全文检索不咋好使
上 es 把 |
|
ifsclimbingAug 11, 2020
32
e s
|