【问题标题】:how to speed up "POS tag" with StanfordPOSTagger?如何使用 StanfordPOSTagger 加速“POS 标签”?
【发布时间】:2018-06-05 07:32:46
【问题描述】:

我不想使用任何推文短语,代码如下。问题是一次只处理300条推文,耗时5分钟,如何加快速度?

顺便说一句,一些代码是根据文本 blob 编辑的。

我使用 gate-EN-twitter(https://gate.ac.uk/wiki/twitter-postagger.html) 的数据集和斯坦福 POS 标记器的 NLTK 接口来标记推文

from nltk.tag import StanfordPOSTagger
from nltk.tokenize import word_tokenize
import time,nltk
start_time = time.time()

CFG = {
        ('NNP', 'NNP'): 'NNP',
        ('NN', 'NN'): 'NNI',
        ('NNI', 'NN'): 'NNI',
        ('JJ', 'JJ'): 'JJ',
        ('JJ', 'NN'): 'NNI',
        }

st = StanfordPOSTagger('/models/gate-EN-twitter.model','/twitie_tagger/twitie_tag.jar', encoding='utf-8')


def _normalize_tags(chunk):
    '''Normalize the corpus tags.
    ("NN", "NN-PL", "NNS") -> "NN"
    '''
    ret = []
    for word, tag in chunk:
        if tag == 'NP-TL' or tag == 'NP':
            ret.append((word, 'NNP'))
            continue
        if tag.endswith('-TL'):
            ret.append((word, tag[:-3]))
            continue
        if tag.endswith('S'):
            ret.append((word, tag[:-1]))
            continue
        ret.append((word, tag))
    return ret



def noun_phrase_count(text):
    matches1=[]
    print('len(text)',len(text))
    for i in range(len(text)//1000):
        tokenized_text = word_tokenize(text[i*1000:i*10000+1000])
        classified_text = st.tag(tokenized_text)
        tags = _normalize_tags(classified_text)


        merge = True
        while merge:
            merge = False
            for x in range(0, len(tags) - 1):
                t1 = tags[x]
                t2 = tags[x + 1]
                key = t1[1], t2[1]
                value = CFG.get(key, '')
                if value:
                    merge = True
                    tags.pop(x)
                    tags.pop(x)
                    match = '%s %s' % (t1[0], t2[0])
                    pos = value
                    tags.insert(x, (match, pos))
                    break

        matches = [t[0] for t in tags if t[1] in ['NNP', 'NNI']] 
        matches1+=matches   
        print("--- %s seconds ---" % (time.time() - start_time))
    fdist = nltk.FreqDist(matches1)
    return [(tag,num) for (tag, num) in fdist.most_common()]

noun_phrase_count(tweets)

【问题讨论】:

    标签: twitter nltk stanford-nlp pos-tagger


    【解决方案1】:

    看起来像 Stanford POS tagger with GATE twitter model is slow 的副本,因此您可以在那里找到更多信息。

    另外;如果有可能两次(或更多)偶然发现相同的输入(推文),您可以考虑将推文(纯 str)作为键并标记为值的字典,这样当您遇到推文时,您首先检查是否它已经在你的字典里了。如果没有,请将其标记并放在那里(如果这条路线可行,为什么不腌制/取消腌制该字典,以便您的代码的调试/后续运行也更快)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多