文本补全

总体思路:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值