我正在使用一个可以包含大量内容的pandas框架,并且对于每个文档,我需要获得一些定义的名词短语。虽然一切正常但它也有点慢,我确信有更好的方法可以达到相同的效果,但我的python知识还不够好。
因此,任何关于如何改进的建议都将受到高度赞赏。
这是我的代码:
import pandas
import nltk, re
from nltk.tokenize import sent_tokenize, word_tokenize, regexp_tokenize, wordpunct_tokenize
from nltk.chunk import *
from nltk.chunk.util import *
from nltk.chunk.regexp import *
from nltk import untag
def chunckMe(str,rule):
np=[]
chunk_parser = RegexpChunkParser(rule, chunk_label='LBL')
sentences= sent_tokenize(str)
for sent in sentences:
d_words=nltk.word_tokenize(sent)
d_tagged=nltk.pos_tag(d_words)
chunked_text = chunk_parser.parse(d_tagged)
tree = chunked_text
for subtree in tree.subtrees():
if subtree.label() == 'LBL': np.append(" ".join(untag(subtree)).lower())
return np;
# main def
def rm_main(data):
np_all=[]
# This works but can probably be done much better ...
for index,row in data.iterrows():
str=row["txt"]
chunk_rule = ChunkRule("<JJ.*><NN.*>+|<JJ.*>*<NN.*><CC>*<NN.*>+|<CD><NN.*>", "Simple noun phrase")
tags = chunckMe(str,[chunk_rule])
np_all.append(', '.join(set(tags)))
data['noun_phrases']=np_all
return data
知道如何避免或改善iterrows部分吗?它有效,但我有强烈的感觉,有更好的方法来做到这一点。