python - 将代码标记列表转换为有效的字符串代码
问题描述
我编写了将 Python 代码转换为列表以计算BLEU 分数的代码:
import re
def tokenize_for_bleu_eval(code):
code = re.sub(r'([^A-Za-z0-9_])', r' \1 ', code)
code = re.sub(r'([a-z])([A-Z])', r'\1 \2', code)
code = re.sub(r'\s+', ' ', code)
code = code.replace('"', '`')
code = code.replace('\'', '`')
tokens = [t for t in code.split(' ') if t]
return tokens
感谢这个片段,我的代码struct.unpack('h', pS[0:2])
被正确解析到列表中['struct', '.', 'unpack', '(', 'h', ',', 'p', 'S', '[', '0', ':', '2', ']', ')']
。
最初,我认为我只需要使用它,' '.join(list_of_tokens)
但它会像这样杀死我的变量名,struct . unpack ('h' , p S [ 0 : 2 ] )
并且我的代码不可执行。
我尝试使用正则表达式粘贴一些变量名,但我无法成功反转我的函数tokenize_for_bleu_eval
以在最后找到可执行代码。有人有想法吗,也许没有在这里似乎太复杂的正则表达式?
编辑:我们不能只删除列表元素之间的所有空格,因为有些例子比如items = [item for item in container if item.attribute == value]
没有空格的回译结果itemforiteminaifitem[0]==1
是无效的。
解决方案
我正在尝试使用此脚本合并令牌
import re
def tokenize_for_bleu_eval(code):
code = re.sub(r'([^A-Za-z0-9_])', r' \1 ', code)
code = re.sub(r'([a-z])([A-Z])', r'\1 \2', code)
code = re.sub(r'\s+', ' ', code)
code = code.replace('"', '`')
code = code.replace('\'', '`')
tokens = [t for t in code.split(' ') if t]
return tokens
def merge_tokens(tokens):
code = ''.join(tokens)
code = code.replace('`', "'")
code = code.replace(',', ", ")
return code
tokenize = tokenize_for_bleu_eval("struct.unpack('h', pS[0:2])")
print(tokenize) # ['struct', '.', 'unpack', '(', '`', 'h', '`', ',', 'p', 'S', '[', '0', ':', '2', ']', ')']
merge_result = merge_tokens(tokenize)
print(merge_result) # struct.unpack('h', pS[0:2])
编辑:
我发现了这个有趣的想法来标记和合并。
import re
def tokenize_for_bleu_eval(code):
tokens_list = []
codes = code.split(' ')
for i in range(len(codes)):
code = codes[i]
code = re.sub(r'([^A-Za-z0-9_])', r' \1 ', code)
code = re.sub(r'([a-z])([A-Z])', r'\1 \2', code)
code = re.sub(r'\s+', ' ', code)
code = code.replace('"', '`')
code = code.replace('\'', '`')
tokens = [t for t in code.split(' ') if t]
tokens_list.append(tokens)
if i != len(codes) -1:
tokens_list.append([' '])
flatten_list = []
for tokens in tokens_list:
for token in tokens:
flatten_list.append(token)
return flatten_list
def merge_tokens(flatten_list):
code = ''.join(flatten_list)
code = code.replace('`', "'")
return code
test1 ="struct.unpack('h', pS[0:2])"
test2 = "items = [item for item in container if item.attribute == value]"
tokenize = tokenize_for_bleu_eval(test1)
print(tokenize) # ['struct', '.', 'unpack', '(', '`', 'h', '`', ',', ' ', 'p', 'S', '[', '0', ':', '2', ']', ')']
merge_result = merge_tokens(tokenize)
print(merge_result) # struct.unpack('h', pS[0:2])
tokenize = tokenize_for_bleu_eval(test2)
print(tokenize) # ['items', ' ', '=', ' ', '[', 'item', ' ', 'for', ' ', 'item', ' ', 'in', ' ', 'container', ' ', 'if', ' ', 'item', '.', 'attribute', ' ', '=', '=', ' ', 'value', ']']
merge_result = merge_tokens(tokenize)
print(merge_result) # items = [item for item in container if item.attribute == value]
该脚本还将记住输入中的每个空格
推荐阅读
- mysql - 根据mysql查询对数组字段进行排序
- angular - 当 bsdatepicker 已更改值时如何更改值
- javascript - 如何按键名迭代数组,如果键为空,请将它们包含在循环 js 中
- sql - 创建从 -1 开始的行索引列
- web-applications - 将 OpenIdConnect 和 JWT 不记名令牌与 Microsoft Identity Web ASP.NET Core 3.1 一起使用
- ruby-on-rails - Action mailer - 通过使用 Ruby on Rails 的联系表单发送电子邮件
- jakarta-mail - 在 EWS 存储的 Javamail 中,用于检查 Outlook 邮箱中未读邮件的 FlagTerm 没有给出正确的结果
- python - apply() 得到了一个意外的关键字参数 'raw'
- javascript - 如何只预加载一次图像
- regex - 在字符类中查找和替换花引号