一个 python 库,它接受一些文本,并用标记替换 phone 数字、名称等
a python library that accepts some text, and replaces phone numbers, names, and so on with tokens
我需要一个 python 库来接受一些文本,并用标记替换 phone 数字、名称等。示例:
输入:请致电 0430013454 联系罗伯特进一步讨论。
输出:请在 PHONE 上致电 NAME 进一步讨论。
换句话说,我需要一个句子,任何一个句子,然后程序将 运行 放在那个句子上,并删除任何看起来像名字、phone 数字或任何其他标识符的东西, 并将其替换为令牌 I.E NAME, PHONE NUMBER 因此该令牌将只是替换信息的文本,以便它不再显示。
必须 python 2.7 兼容。有人会知道如何做到这一点吗?
干杯!
不太确定名称识别。但是,如果您知道要查找的名称,那将很容易。您可以列出要查找的所有名称,并检查是否每个名称都在字符串中,如果是,则使用 string.replace
。如果名称是随机的,您可以查看 NLTK,我认为它们可能有一些名称实体识别。虽然我真的什么都不知道...
但至于 phone 个数字,那很容易。您可以将字符串拆分为一个列表,并检查是否有任何元素由数字组成。您甚至可以检查长度以确保它是 10 位数字(根据您的示例,我假设所有数字都是 10)。
像这样...
example_input = 'Please call Robert on 0430013454 to discuss this further.'
new_list = example_input.split(' ')
for word in new_list:
if word.isdigit():
pos = new_list.index(word)
new_list[pos] = 'PHONE'
example_output = ' '.join(new_list)
print example_output
这将是输出:'Please call Robert on PHONE to discuss this further'
如果您想确保数字的长度为 10,则 if 语句类似于 if word.isdigit() and len(word) == 10:
。
正如哈里森指出的那样,nltk 已经命名实体识别,这就是你想要的这个任务。 Here 是一个很好的入门示例。
来自网站:
import nltk
sentences = nltk.sent_tokenize(text)
tokenized_sentences = [nltk.word_tokenize(sentence) for sentence in sentences]
tagged_sentences = [nltk.pos_tag(sentence) for sentence in tokenized_sentences]
chunked_sentences = nltk.ne_chunk_sents(tagged_sentences, binary=True)
def extract_entity_names(t):
entity_names = []
if hasattr(t, 'label') and t.label:
if t.label() == 'NE':
entity_names.append(' '.join([child[0] for child in t]))
else:
for child in t:
entity_names.extend(extract_entity_names(child))
return entity_names
entity_names = []
for tree in chunked_sentences:
# Print results per sentence
# print extract_entity_names(tree)
entity_names.extend(extract_entity_names(tree))
# Print all entity names
#print entity_names
# Print unique entity names
print set(entity_names)
我需要一个 python 库来接受一些文本,并用标记替换 phone 数字、名称等。示例:
输入:请致电 0430013454 联系罗伯特进一步讨论。
输出:请在 PHONE 上致电 NAME 进一步讨论。
换句话说,我需要一个句子,任何一个句子,然后程序将 运行 放在那个句子上,并删除任何看起来像名字、phone 数字或任何其他标识符的东西, 并将其替换为令牌 I.E NAME, PHONE NUMBER 因此该令牌将只是替换信息的文本,以便它不再显示。
必须 python 2.7 兼容。有人会知道如何做到这一点吗?
干杯!
不太确定名称识别。但是,如果您知道要查找的名称,那将很容易。您可以列出要查找的所有名称,并检查是否每个名称都在字符串中,如果是,则使用 string.replace
。如果名称是随机的,您可以查看 NLTK,我认为它们可能有一些名称实体识别。虽然我真的什么都不知道...
但至于 phone 个数字,那很容易。您可以将字符串拆分为一个列表,并检查是否有任何元素由数字组成。您甚至可以检查长度以确保它是 10 位数字(根据您的示例,我假设所有数字都是 10)。
像这样...
example_input = 'Please call Robert on 0430013454 to discuss this further.'
new_list = example_input.split(' ')
for word in new_list:
if word.isdigit():
pos = new_list.index(word)
new_list[pos] = 'PHONE'
example_output = ' '.join(new_list)
print example_output
这将是输出:'Please call Robert on PHONE to discuss this further'
如果您想确保数字的长度为 10,则 if 语句类似于 if word.isdigit() and len(word) == 10:
。
正如哈里森指出的那样,nltk 已经命名实体识别,这就是你想要的这个任务。 Here 是一个很好的入门示例。
来自网站:
import nltk
sentences = nltk.sent_tokenize(text)
tokenized_sentences = [nltk.word_tokenize(sentence) for sentence in sentences]
tagged_sentences = [nltk.pos_tag(sentence) for sentence in tokenized_sentences]
chunked_sentences = nltk.ne_chunk_sents(tagged_sentences, binary=True)
def extract_entity_names(t):
entity_names = []
if hasattr(t, 'label') and t.label:
if t.label() == 'NE':
entity_names.append(' '.join([child[0] for child in t]))
else:
for child in t:
entity_names.extend(extract_entity_names(child))
return entity_names
entity_names = []
for tree in chunked_sentences:
# Print results per sentence
# print extract_entity_names(tree)
entity_names.extend(extract_entity_names(tree))
# Print all entity names
#print entity_names
# Print unique entity names
print set(entity_names)