文本补全
作者:互联网
总体思路:
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
标签:word,补全,##,dic,ngram,num,line,文本 来源: https://blog.csdn.net/qq_25992377/article/details/104651350