当前位置:   article > 正文

文本补全_文本补全算法

文本补全算法

总体思路:

1. 通过一段文本,获取ngram词汇组合,如果是多gram组合,分别做ngram再组合更清晰。

2. 使用ngram构建一个字典树

3. 输入一个字,获取下一个字的词频排序。

如下为核心代码部分

1. 取ngram代码:

  1. def get_ngram(line, num):
  2. temp_ngram=[]
  3. for pos in range(0, len(line)-num+1):#由于是+num选区且左开右闭,所以避免出界而-num,避免下文patch选取少一个而+1
  4. line_patch=line[pos:pos+num]## 从pos位置开始,每num个长度节选一个path
  5. temp_ngram.append(line_patch)
  6. return temp_ngram

2. 构建trie树,还是不能够细致地想,得宏观是思考,不然会很绕。[参考了苏神的代码https://spaces.ac.cn/archives/4256]

  1. class SimpleTrie:
  2. def __init__(self):
  3. self.dic={} #初始化一个词典树
  4. def add_dict(self,word):
  5. _=self.dic # _表示当前的临时空间,把全局的dic赋值过来
  6. for c in word: #(假设word="我们")
  7. if c not in _: # "我" 不在词典中
  8. _[c]={} ## 给"我"构建一个词典
  9. _=_[c] ##并插入词典///同时如果在词典中找到了"我",则直接插入到当下"我"的临时空间下
  10. ## 此时插入后,词典中必然有一个{"char":{}},此时_代表了这个临时空间,这个时候放入整个单词的词频即可。
  11. if word in _:# 当一个单词遍历完之后,对整个单词进行判断,存放到上一步的{}中
  12. _[word]+=1
  13. else:
  14. _[word] = 1

3. 获取下一个字符,这里主要是返回一个字频排序

  1. def get_nextword(word):
  2. word_next = []
  3. words = []
  4. fre = []
  5. for one in simple_trie.dic[word]:
  6. words.append(one)
  7. fre.append(simple_trie.dic[word][one][word + one])##由于是只补全一个字,所以沿伸出一个字符就好
  8. dd = dict(zip(words, fre))
  9. dd = sorted(dd.items(), key=lambda x: x[1], reverse=True)
  10. return dd

应该还有别的思路,主要是练习从苏神代码中学习到的字典树。

完整代码在: https://github.com/mathCrazyy/NLP-tiny-code/tree/master/code

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/397491?site
推荐阅读
相关标签
  

闽ICP备14008679号