VR-LLM-AAC
方案测试
测试一:汉字聚类
-
hanzi_similar 算法 Github
-
Kmeans 算法
hanzi_similar 通过四角编码,汉字结构,偏旁部首,笔画数来判断两个汉字之间的相似度
将权重调整为
调高偏旁部首和汉字结构的权重
根据任意两个汉字之间的相似度,通过 Kmeans 算法构建相似度矩阵,取得两两之间边的数值,进行聚类,得到 hanzi_clusters.txt
测试采用随机给出 n 个空,每个空随机分配一个聚类的方法,同时将每一个聚类按照使用频率从大到小排序扔给 ChatGPT 进行选择
结果是无论 3.5-turbo 还是 4o 都不能很好的完成预测,主要问题还是无中生有,假如频率指标没有改善
方案二:音节思路
2024.6.12
由于最多有九种组合,尝试在键盘上再加入一行数字,这样打一个字需要操作三下(声母,韵母,选择组合)
例如 \(1 1 1\) 则输入 "ma"
将拼音作为 prompt 扔给 ChatGPT 让它进行预测能达到几乎百分百的效果
InitialConsonantPath = "./spelling/InitialConsonants.txt"
VowelPath = "./spelling/Vowels.txt"
def read_file_lines(filename):
lines = []
with open(filename, 'r') as file:
for line in file:
lines.append(line.strip())
return lines
def combine(InitialConsonantNumber, VowelNumber, InitialConsonants, Vowels):
combinations = ["{}{}".format(InitialConsonant.strip(), Vowel.strip()) for InitialConsonant in InitialConsonants[InitialConsonantNumber].split() for Vowel in Vowels[VowelNumber].split()]
return combinations
InitialConsonants = read_file_lines(InitialConsonantPath)
Vowels = read_file_lines(VowelPath)
def enter():
print(f"声母: {InitialConsonants}\n韵母: {Vowels}\n")
message = ""
while True:
a = int(input()) - 1
b = int(input()) - 1
combination = combine(a, b, InitialConsonants, Vowels)
print(combination)
c = int(input()) - 1
message += f"{combination[c]} "
more = input("是否继续选择?(yes/no): ").lower()
if more != "yes":
break
return message
def generate_prompt():
prompt = ""
prompt += f"你是一个擅长中文的汉语言学家,你的汉语发音也十分标准,我将给你一些线索,请你猜测我正在说什么。像你知道的那样,中文的一个汉字由一个声母音节和一个韵母音节构成,例如,\"虐\"的拼音是 \"nve\",一下面我将给出每个字可能的拼音,请你从这些音节中推测出一个字,要保证这些字会连成一我想说的话,逻辑清晰,语意连贯。\n"
prompt += f"注意\"/\"代表空韵母\n"
prompt += enter()
return prompt
if __name__ == "__main__":
a = int(input()) - 1
b = int(input()) - 1
combination = combine(a, b, InitialConsonants, Vowels)
print(combination)
c = int(input()) - 1
print(combination[c])
ChatGPT 3.5-turbo 预测:
2024.6.13
上述方法并不能简化按键效率,每个字需要进行三次操作,所以依然考虑只通过按声母韵母进行输入,通过 LLM 预测结果
考虑利用 Pinyin2Hanzi
库 GitHub
pip install Pinyin2Hanzi
这个库提供了检测拼音是否合法,将拼音转变为合法和将拼音转变成汉字等功能
首先将 prompt 生成器和 ChatGPT 接口集成得到类 Generator
和 ChatBot
基于三者简单实现一个虚拟键盘,实现方法是将所有输入可能性通过 Pinyin2Hanzi
库转化为其最有可能所代表的汉字,将两者合并成询问对扔给 ChatGPT 进行预测
时间复杂度约为 \(O(f(m^n) + C)\),其中 \(m\) 为单个拼音组合数,约为 \(6\), \(n\) 为输入字数,\(f(x), C\) 分别为库处理复杂度常数和询问常数
根据日常生活习惯 \(n\) 极大概率小于 \(10\),而 \(m\) 最大为 \(9\),时间复杂度较为合理
但是由于自身算法原因 \(f, C\) 常数太大,降低了效率
通过实验观察预测效率显著提高,对词语的预测率几乎为百分百,且耗时较短
然而对句子预测依然不准,且太过耗时
期望结果是 ”我想上厕所“
若对句子进行人为断句,则又能成功预测
2024.6.14
不难发现时间复杂度主要是因为 Pinyin2Hanzi
库的算法问题,然而其本身算法我们不能进行修改,所以考虑减少扔进去的数据量
同时已知若进行短句预测准确率能够显著提升,所以我们考虑修改算法
我们希望数据量从 \(m^n\) 缩减为一个常数,考虑每次再句子后面增加一个拼音时便进行检测,并选出最有可能的 \(q\) 组拼音
如此,时间复杂度便降为 \(O(n\times f(q) + C)\),其中我们取 \(q\) 为 \(10\) 增加容错
Pinyin2Hanzi
库中有两种算法,一种基于 viterbi 算法,一种基于 DAG \(+\) 动态规划
前者时间复杂度大但是预测精准,后者时间复杂度极小但是预测较为模糊
基于两种算法的不同特点,我们利用前者在打字时缩减数据量,利用后者预测最终结果
预测准确率十分高,但是大于五个字时每次输入需要等待 \(10s\) 左右
结果是这个项目寄了
标签:prompt,拼音,AAC,InitialConsonants,复杂度,VR,算法,LLM,input From: https://www.cnblogs.com/ResurgamLiBoyi/p/18248517