其他分享
首页 > 其他分享> > 文本补全

文本补全

作者:互联网

总体思路:

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