【说话处理惩罚与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)
    [(
    I, NN), (do, NN), (not, NN), (like, NN), (green, NN),
    (
    eggs, NN), (and, NN), (ham, NN), (,, NN), (I, NN),
    (
    do, NN), (not, NN), (like, NN), (them, NN), (Sam, NN),
    (
    I, NN), (am, NN), (!, 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., NN) #nouns(default)
    ... ]
    #不过要重视,正则表达式是按次序匹配的,匹配上第一个后面的就不会在匹配
    >>>regex p_tagger = nltk.RegexpTagger(patterns)
    >>>regex p_tagger.tag(brown_sents[3])
    [(
    ``, NN), (Only, NN), (a, NN), (relative, NN), (handful, NN),
    (
    of, NN), (such, NN), (reports, NNS), (was, NNS), (received, VBD),
    (
    "", NN), (,, NN), (the, NN), (jury, NN), (said, NN), (,, NN),
    (
    ``, NN), (considering, VBG), (the, NN), (widespread, NN), ...]
    #经由过程检测,这种体式格式正确率进步了
    >>>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))

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