语音识别HResults统计工具以及字根据关键词进行合并

#主要想说一下关键词合并

1.HResults统计工具可以参考其他博主的:
https://blog.csdn.net/weixin_30348519/article/details/98426654?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172088587416800215066191%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=172088587416800215066191&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-98426654-null-null.142^v100^pc_search_result_base3&utm_term=hresults&spm=1018.2226.3001.4187

2.HResults统计工具传入的文本格式:

#!MLF!#
"*No1.lab"
安
徽
省
pro
合
肥
市
ai
bot
a
i
和
en
open
a
i
chat
g
p
t
的
大
家
g
p
t
.

关键词内容:
it
ai
aibot
chatgpt
openai
合肥市
合肥
gpt
省市
安徽

这里说明一下,中文按照字一一换行,英文按照单词换行,但是语音识别发音可能就拆开了,但是想根据关键词,将相邻的字组成关键词如下:

#!MLF!#
"*No1.lab"
安徽
省
pro
合肥市
aibot
ai
和
en
openai
chatgpt
的
大
家
gpt
.

代码实现:(根据DFA算法改的)

python 复制代码
# -*- coding:utf-8 -*-
import copy
import time,re

time1 = time.time()
"""
DFA算法:
它的基本思想是基于状态转移来检索敏感词,只需要扫描一次待检测文本,就能对所有敏感词进行检测
"""


# DFA算法
class DFAFilter(object):
    def __init__(self):
        self.keyword_chains = {}  # 关键词链表
        self.delimit = '\x00'  # 限定

    # 将敏感词内容添加关键词链表
    def add(self, keyword):
        keyword = keyword.lower()  # 关键词英文变为小写
        chars = keyword.strip()  # 关键字去除首尾空格和换行
        if not chars:  # 如果关键词为空直接返回
            return
        level = self.keyword_chains
        # 遍历关键字的每个字
        for i in range(len(chars)):
            # 如果这个字已经存在字符链的key中就进入其子字典
            if chars[i] in level:
                level = level[chars[i]]
                print(level)
            else:
                # isinstance(level, dict)判断是否是一个类型,是返回True
                if not isinstance(level, dict):
                    print("print(level)", level)
                    break
                for j in range(i, len(chars)):
                    level[chars[j]] = {}
                    last_level, last_char = level, chars[j]
                    level = level[chars[j]]
                last_level[last_char] = {self.delimit: 0}
                break
        if i == len(chars) - 1:
            level[self.delimit] = 0

    # 读取关键词
    def parse(self, path):
        with open(path, encoding='utf-8') as f:
            for keyword in f:
                self.add(str(keyword).strip())
        # print(self.keyword_chains)
    def two_eng(self,char):
        if len(char)>=2 and re.match(r"[a-zA-Z\']",char):
            for letter in char:
                # print("letter",letter, level)
                if letter in level:
                    level = level[letter]
                    if self.delimit in level:
                        matched = True
                else:
                    print("break", char, level)
                    break
    # 合并关键词
    def filter(self, message, repl="*"):
        ret = []
        start = 0
        print(self.keyword_chains)
        while start < len(message):
            level = self.keyword_chains
            matched = False
            end = False
            key_word = ""
            letter_word=""
            for i in range(start, len(message)):
                char = message[i]
                # print(char)
                if len(char)>=2:
                    stop=False
                    comin=copy.copy(matched)
                    for letter in char:
                        if letter in level:
                            level = level[letter]
                            letter_word += letter
                        else:
                            if comin:
                                matched = True
                            else:
                                matched = False
                            stop=True
                            break
                    # 判断这个char在level还是不在
                    if stop:
                        letter_word = ""
                        break
                    else:
                        # print('ok',char)
                        key_word+=letter_word
                        letter_word = ""
                        if self.delimit in level:
                            matched = True
                            if i+1 == len(message):
                                end=True

                else:
                    #一直遍历,直到不存在的时候退出,看char是否ok
                    if char in level:
                        level = level[char]
                        key_word+=char
                        if self.delimit in level:
                            matched = True
                            if i+1 == len(message):
                                end=True
                    else:
                        break
            if matched:
                ret.append(key_word)
                start = i
                if end:
                    break
            else:
                # if
                ret.append(message[start])
                start += 1
        return ret


if __name__ == "__main__":
    gfw = DFAFilter()
    path = 'key_word.txt'
    gfw.parse(path)
    text  = ['安', '徽', '省','pro', '合', '肥','市','ai', 'bot','a', 'i', '和','en', 'open', 'a', 'i', 'chat','g','p','t','的', '大', '家','g','p','t']
    result = gfw.filter(text)
    print(text)
    print(result)
    time2 = time.time()
    print('总共耗时:' + str(time2 - time1) + 's')
    for I in result:
        print(I)
相关推荐
代码的乐趣5 分钟前
支持selenium的chrome driver更新到131.0.6778.204
chrome·python·selenium
好开心337 分钟前
axios的使用
开发语言·前端·javascript·前端框架·html
又蓝30 分钟前
使用 Python 操作 Excel 表格
开发语言·python·excel
余~~1853816280042 分钟前
稳定的碰一碰发视频、碰一碰矩阵源码技术开发,支持OEM
开发语言·人工智能·python·音视频
0zxm1 小时前
06 - Django 视图view
网络·后端·python·django
Am心若依旧4091 小时前
[c++11(二)]Lambda表达式和Function包装器及bind函数
开发语言·c++
明月看潮生1 小时前
青少年编程与数学 02-004 Go语言Web编程 20课题、单元测试
开发语言·青少年编程·单元测试·编程与数学·goweb
大G哥1 小时前
java提高正则处理效率
java·开发语言
ROBOT玲玉2 小时前
Milvus 中,FieldSchema 的 dim 参数和索引参数中的 “nlist“ 的区别
python·机器学习·numpy
VBA63372 小时前
VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL
开发语言