【说话处理惩罚与Python】5.4主动标注

    添加时间:2013-5-26 点击量:

    在这里有不合的体式格式来给文本主动添加词性标识表记标帜。

    一个词的标识表记标帜,要依附于这个词和它在句子中的高低文。

    所以:我们将处理惩罚句子层次而不是词汇层次的数据。

    下面的所有代码示例中都以这些代码为根蒂根基:

    >>> nltk.corpusimport brown
    
    >>>brown_tagged_sents= brown.tagged_sents(categories=news
    >>>brown_sents= brown.sents(categories=news



    默认标注器




    把最有可能的标识表记标帜进行标注
    

    tags
    =[tag for (word,tag) in brown.tagged_words(categories=’news’)]

    nltk.FreqDist(tags).max()

    ‘NN’





    如今应用将所有词都标注成NN的标注器
    
    >>>raw = I donot like greeneggs and ham,I donot like them SamI am!
    >>>tokens = nltk.word_tokenize(raw)
    >>>default_tagger =nltk.DefaultTagger(NN
    >>>default_tagger.tag(tokens)
    [(
    INN), (doNN), (notNN), (likeNN), (greenNN),
    eggsNN), (andNN), (hamNN), (NN), (INN),
    doNN), (notNN), (likeNN), (themNN), (SamNN),
    INN), (amNN), (!NN)]



    其实,大师也有感触感染,这种体式格式并不会很好,可以经由过程下面这个函数,测评一下标注的成果。




    >>>default_tagger.evaluate(brown_tagged_sents)
    
    0.13089484257215028



    正则表达式标注器




    >>>patterns= [
    
    ... (r
    .ing¥VBG), gerunds
    ... (r.ed¥VBD), simple past
    ... (r.es¥VBZ), 3rdsingular present
    ... (r.ould¥MD), modals
    ... (r.\s¥NN¥), possessivenouns
    ... (r.s¥NNS), plural nouns
    ... (r^-?[0-9]+(.[0-9]+)?¥CD), cardinal numbers
    ... (r.NNnouns(default)
    ... ]
    不过要重视,正则表达式是按次序匹配的,匹配上第一个后面的就不会在匹配
    >>>regex p_tagger = nltk.RegexpTagger(patterns)
    >>>regex p_tagger.tag(brown_sents[3])
    [(
    ``NN), (OnlyNN), (aNN), (relativeNN), (handfulNN),
    ofNN), (suchNN), (reportsNNS), (wasNNS), (receivedVBD),
    ""NN), (NN), (theNN), (juryNN), (saidNN), (NN),
    ``NN), (consideringVBG), (theNN), (widespreadNN), ...]
    经由过程检测,这种体式格式正确率进步了
    >>>regex p_tagger.evaluate(brown_tagged_sents)
    0.20326391789486245



    查询标注器




    找出100个最频繁的词,存储他们最有可能的标识表记标帜。
    

    然后应用这些信息作为查询标注器的模型

    fd
    =nltk.FreqDist(brown.words(categories=news))
    cfd
    =nltk.ConditionalFreqDist(brown.tagged_words(categories=news))
    most_freq_words
    =fd.keys()[:100]
    likely_tags
    =dict((word,word,cfd[word].max()) for word in most_freq_words)
    baseline_tagger
    =nltk.UnigramTagger(model=likely_tags)
    baseline_tagger.evaluate(brown_tagged_sents)



    经由过程对这个标注器进行评价,可以看到评价的成果,正确率又提拔了:0.45578495136941344



    若是我们拿这个标注器在一些未标注的文本长进行标注,会呈现一些None的标签,这是因为它们不再100个最频繁的词汇傍边。




    在如许的景象下,我们可以应用 回退,当查询标注器无法工作的时辰,回退到另一个标注器进行工作。
    
    >>>baseline_tagger =nltk.UnigramTagger(model=likely_tags,
    ... backoff
    =nltk.DefaultTagger(NN))

    所有随风而逝的都属于昨天的,所有历经风雨留下来的才是面向未来的。—— 玛格丽特·米切尔 《飘》
    分享到: