赞
踩
总体思路:
1. 通过一段文本,获取ngram词汇组合,如果是多gram组合,分别做ngram再组合更清晰。
2. 使用ngram构建一个字典树
3. 输入一个字,获取下一个字的词频排序。
如下为核心代码部分
1. 取ngram代码:
- def get_ngram(line, num):
- temp_ngram=[]
- for pos in range(0, len(line)-num+1):#由于是+num选区且左开右闭,所以避免出界而-num,避免下文patch选取少一个而+1
- line_patch=line[pos:pos+num]## 从pos位置开始,每num个长度节选一个path
- temp_ngram.append(line_patch)
- return temp_ngram
2. 构建trie树,还是不能够细致地想,得宏观是思考,不然会很绕。[参考了苏神的代码https://spaces.ac.cn/archives/4256]
- class SimpleTrie:
- def __init__(self):
- self.dic={} #初始化一个词典树
- def add_dict(self,word):
- _=self.dic # _表示当前的临时空间,把全局的dic赋值过来
- for c in word: #(假设word="我们")
- if c not in _: # "我" 不在词典中
- _[c]={} ## 给"我"构建一个词典
- _=_[c] ##并插入词典///同时如果在词典中找到了"我",则直接插入到当下"我"的临时空间下
- ## 此时插入后,词典中必然有一个{"char":{}},此时_代表了这个临时空间,这个时候放入整个单词的词频即可。
- if word in _:# 当一个单词遍历完之后,对整个单词进行判断,存放到上一步的{}中
- _[word]+=1
- else:
- _[word] = 1
3. 获取下一个字符,这里主要是返回一个字频排序
- def get_nextword(word):
- word_next = []
- words = []
- fre = []
- for one in simple_trie.dic[word]:
- words.append(one)
- fre.append(simple_trie.dic[word][one][word + one])##由于是只补全一个字,所以沿伸出一个字符就好
- dd = dict(zip(words, fre))
- dd = sorted(dd.items(), key=lambda x: x[1], reverse=True)
- return dd
应该还有别的思路,主要是练习从苏神代码中学习到的字典树。
完整代码在: https://github.com/mathCrazyy/NLP-tiny-code/tree/master/code
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。