是否有SOTA解决方案来查找带有联系信息(电话号码、社交媒体链接等)的文本?
我知道这个任务是通过正则表达式来解决的,我已经尝试过了,但是这种类型的数字存在问题:"8 994 966 12 72“、"39_30_03*”、"912 five69 O7 OO“、"8918ob801ra70sha10s”等等。如果在所有这些表达式下编写正则表达式,它们已经开始影响正则数字,不需要删除。我试过使用NER模型,但他们没有看到具体的电话号码。
我并不要求编写一个通用的正则表达式,我特别感兴趣的是使用机器学习技术的解决方案(例如,我尝试了NER,但它没有工作)。我也推迟使用BERT和类似的SOTA模型,因为它们没有很好的嵌入,而且我的计算能力和时间是有限的。
提前谢谢你。
发布于 2022-08-22 10:30:45
您的主要问题可能来自缺乏不正确的数据,而不是模型本身。
这就是为什么您可以很容易地使用随机规则生成不正确的数据及其校正值。
例如,要创建1000个错误的电话号码:
import random
def random_phone_num_generator():
first = str(random.randint(100, 999))
second = str(random.randint(1, 888)).zfill(3)
last = (str(random.randint(1, 9998)).zfill(4))
while last in ['1111', '2222', '3333', '4444', '5555', '6666', '7777', '8888']:
last = (str(random.randint(1, 9998)).zfill(4))
return '{}-{}-{}'.format(first, second, last)
n = 1000
wrong_numbers = []
right_numbers = []
for i in range(0, n):
right_numbers.append(random_phone_num_generator())
error_probability = 0.1
phone_number_len = 12
def random_option(options_list = []):
len_options = len(options_list)-1
random_position = random.randint(0, len_options)
return options_list[random_position]
#code to have one char error in a phone number
for i in range(0, len(right_numbers)):
current_phone_number = right_numbers[i]
random_float = random.uniform(0, 1)
random_position = int(random_float * phone_number_len)
current_char_random_position = current_phone_number[random_position]
new_error_char = ''
if current_char_random_position == '-':
new_error_char = random_option(['dash','~','/'])
elif current_char_random_position == '1':
new_error_char = random_option(['one','One'])
elif current_char_random_position == '2':
new_error_char = random_option(['two','tWo'])
elif current_char_random_position == '3':
new_error_char = random_option(['three','Three','E'])
elif current_char_random_position == '4':
new_error_char = random_option(['four','Four'])
elif current_char_random_position == '5':
new_error_char = random_option(['five','Five'])
elif current_char_random_position == '6':
new_error_char = random_option(['six','Six','b'])
elif current_char_random_position == '7':
new_error_char = random_option(['seven','Seven','T'])
elif current_char_random_position == '8':
new_error_char = random_option(['height','Height'])
elif current_char_random_position == '9':
new_error_char = random_option(['nine','Nine'])
elif current_char_random_position == '0':
new_error_char = random_option(['zero','Zero','O'])
new_error_char = random_option(['',' ']) + new_error_char + random_option(['',' ']) #random spaces around the number
new_error_string = current_phone_number[:random_position] + new_error_char + current_phone_number[random_position+1:]
wrong_numbers.append(new_error_string)
print(wrong_numbers)现在,您可以使用大量不正确和正确的数据来训练任何模型(包括NER)。
请注意,您必须为可能拥有的每个场景生成不正确的数据。
这不需要大量的计算,只要生成的不正确/正确的数据与实际数据(可能约为10%)相比并不太重要,这样才能足够接近现实。
https://datascience.stackexchange.com/questions/113723
复制相似问题