一个 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)