私は、テキスト文/段落のリストからPythonで名前付きエンティティ(NLTKを使用)を削除するためのユーザー定義関数をいくつか書いています。私が抱えている問題は、私の方法が非常に遅い、特に大量のデータの場合です。誰もがこれを最適化してより速く走らせる方法を提案していますか?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)
codereviewへの移行が適切であるとは確信していません。余りにも遅いコード_問題ですが、これは「私のコードをより良く構造化できますか」ということではありません。 – alexis