python - 使用 NLTK 快速删除命名实体

标签 python optimization nltk named-entity-recognition

我编写了几个用户定义的函数,用于从文本句子/段落列表中删除 Python 中的命名实体(使用 NLTK)。我遇到的问题是我的方法非常慢,尤其是对于大量数据。有人对如何优化它以使其运行得更快有建议吗?

import nltk
import string

# Function to reverse tokenization
def untokenize(tokens):
    return("".join([" "+i if not i.startswith("'") and i not in string.punctuation else i for i in tokens]).strip())

# Remove named entities
def ne_removal(text):
    tokens = nltk.word_tokenize(text)
    chunked = nltk.ne_chunk(nltk.pos_tag(tokens))
    tokens = [leaf[0] for leaf in chunked if type(leaf) != nltk.Tree]
    return(untokenize(tokens))

为了使用代码,我通常有一个文本列表,并通过列表理解调用 ne_removal 函数。下面的例子:

text_list = ["Bob Smith went to the store.", "Jane Doe is my friend."]
named_entities_removed = [ne_removal(text) for text in text_list]
print(named_entities_removed)
## OUT: ['went to the store.', 'is my friend.']

更新:我尝试使用此代码切换到批处理版本,但它只是稍微快一点。会继续探索。感谢您迄今为止的投入。

def extract_nonentities(tree):
    tokens = [leaf[0] for leaf in tree if type(leaf) != nltk.Tree]
    return(untokenize(tokens))

def fast_ne_removal(text_list):
    token_list = [nltk.word_tokenize(text) for text in text_list]
    tagged = nltk.pos_tag_sents(token_list)
    chunked = nltk.ne_chunk_sents(tagged)
    non_entities = []
    for tree in chunked:
        non_entities.append(extract_nonentities(tree))
    return(non_entities)

最佳答案

每次调用ne_chunk()时,它都需要初始化一个分块器对象并从磁盘加载用于分块的统计模型。 pos_tag() 也是如此。因此,不要一次在一个句子上调用它们,而是在完整的文本列表上调用它们的批处理版本:

all_data = [ nltk.word_tokenize(sent) for sent in list_of_all_sents ]
tagged = nltk.pos_tag_sents(all_data)
chunked = nltk.ne_chunk_sents(tagged)

这应该会给你带来相当大的加速。如果这对于您的需求来说仍然太慢,请尝试分析您的代码并考虑是否需要切换到更强大的工具,例如 @Lenz 建议的。

关于python - 使用 NLTK 快速删除命名实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43742956/

相关文章:

python - 在python中创建不规则锯齿函数

python - 从 GitLab CI 将应用程序部署到 App Engine 时权限被拒绝

python - 列出 N 以下所有素数的最快方法

php - ajax-heavy Apache+Mysql+PHP站点的服务器优化

python-3.x - 使用GenSim的短语之间的语义相似性

python - Windows 7 上的 Pyusb 找不到任何设备

python - 具有不同输入大小的 Keras 共享层

sql - select * from table where datetime in month(不破坏索引)

Python nltk 资源 u'tokenizers/punkt/english.pickle' 未找到 bu 它实际上存在

python - 从 nltk word_tokenize 获取原始文本的索引