語(yǔ)言模型:使用NLTK訓(xùn)練

語(yǔ)言模型:使用NLTK訓(xùn)練并計(jì)算困惑度和文本熵

Author: Sixing Yan

這一部分主要記錄我在閱讀NLTK的兩種語(yǔ)言模型源碼時(shí)滑燃,一些遇到的問(wèn)題和理解。

1. NLTK中訓(xùn)練語(yǔ)言模型MLE和Lidstone有什么不同

NLTK 中兩種準(zhǔn)備ngram語(yǔ)言模型的方式:最大似然估計(jì)MLE和平滑Lidstone忱详。兩者的實(shí)現(xiàn)方式都是基于統(tǒng)計(jì)信息,而沒(méi)有進(jìn)行又梯度更新的估計(jì)。

(1)使用語(yǔ)言模型計(jì)算困惑度或文本熵

使用NLTK構(gòu)建了一個(gè)語(yǔ)言模型后聊浅,一般用于計(jì)算給定輸入的困惑度 perplexity 或者文本熵 entropy 暑椰。這兩個(gè)打分函數(shù)都調(diào)用了它們(MLELidstone)父類(LanguageModel)的score函數(shù)霍转。

外部調(diào)用score的時(shí)候,其實(shí)是通過(guò)各自的unmasked_score函數(shù)計(jì)算的一汽,MLELid有不同的unmasked_score函數(shù)

    def score(self, word, context=None):
        """Masks out of vocab (OOV) words and computes their model score.

        For model-specific logic of calculating scores, see the `unmasked_score`
        method.
        """
        return self.unmasked_score(
            self.vocab.lookup(word), self.vocab.lookup(context) if context else None
        )

(2)lm.MLE vs. lm.Lidstone的區(qū)別和聯(lián)系

最大似然估計(jì)的核心方法

class MLE(LanguageModel):
    """Class for providing MLE ngram model scores.

    Inherits initialization from BaseNgramModel.
    """

    def unmasked_score(self, word, context=None):
        """Returns the MLE score for a word given a context.

        Args:
        - word is expcected to be a string
        - context is expected to be something reasonably convertible to a tuple
        """
        return self.context_counts(context).freq(word)

k平滑的核心方法

    def unmasked_score(self, word, context=None):
        """Add-one smoothing: Lidstone or Laplace.

        To see what kind, look at `gamma` attribute on the class.

        """
        counts = self.context_counts(context)
        word_count = counts[word]
        norm_count = counts.N()
        return (word_count + self.gamma) / (norm_count + len(self.vocab) * self.gamma)

這兩個(gè)模型都是用了LanguageModel.context_counts()函數(shù)避消。

(3)現(xiàn)在探究一下兩者unmasked_score函數(shù)都調(diào)用的context_counts函數(shù)。

    def context_counts(self, context):
        """Helper method for retrieving counts for a given context.

        Assumes context has been checked and oov words in it masked.
        :type context: tuple(str) or None

        """
        return (
            self.counts[len(context) + 1][context] if context else self.counts.unigrams
        )

如果沒(méi)指定上下文的時(shí)候召夹,這個(gè)函數(shù)返回的是self.counts.unigrams對(duì)象

那么再看self.counts是什么:默認(rèn)情況下岩喷,是一個(gè)NgramCounter()對(duì)象

self.counts = NgramCounter() if counter is None else counter

(4)所以我希望知道self.counts.unigrams.freq(word)計(jì)算的是什么

self._counts[1] = self.unigrams = FreqDist() 可知,FreqDist().freq(word)對(duì)應(yīng)是word的頻率

word_count = counts[word] 的作用也是調(diào)取word的頻率监憎,所以和FreqDist().freq(word)的作用一樣纱意。

(5)結(jié)論

lm.MLE 是沒(méi)加平滑的 lm.Lidstone方法

2. 另一個(gè)問(wèn)題:如何使用context這個(gè)功能呢

context_counts()可知有context的時(shí)候會(huì)返回 self.counts[len(context) + 1][context]

然后看self.counts = NgramCounter()[len(context) + 1][context] 調(diào)用鲸阔,它會(huì)使用self._counts 這個(gè)成員:

    def __getitem__(self, item):
        """User-friendly access to ngram counts."""
        if isinstance(item, int):
            return self._counts[item]
        elif isinstance(item, string_types):
            return self._counts.__getitem__(1)[item]
        elif isinstance(item, Sequence):
            return self._counts.__getitem__(len(item) + 1)[tuple(item)]

self._counts = defaultdict(ConditionalFreqDist)由此初始化偷霉,由第7行[len(word)][word]取到同長(zhǎng)度下的該word的頻數(shù)迄委。

而從counts = self.context_counts(context);word_count = counts[word] 這部分看,它返回一個(gè)Key-value型的數(shù)據(jù)類型类少,類似于如果context=(word1, word2);len(content)=2叙身,那么應(yīng)該返回trigrams的類實(shí)例(這里用了len(item)+1做索引)。于是乎就是考慮了前面兩個(gè)詞硫狞,然后計(jì)量(word1, word2, word)這個(gè)組合信轿。

(1)結(jié)論

使用context不用改變?cè)蓄惖某跏蓟苯邮褂眉纯伞?/p>

NgramCounter會(huì)根據(jù)輸入的List[Tuple]tuple長(zhǎng)度len(tuple)來(lái)設(shè)置ngram_order的值(具體可看update()函數(shù))妓忍。所以如果fit( )的時(shí)候用的是ngrams(2)的列表虏两,那么context輸入的長(zhǎng)度就必須是1。

問(wèn)題是世剖,self.context_counts(context)返回int值定罢,它是怎么可以使用word_count = counts[word]這種調(diào)用呢?因?yàn)樵谟?jì)算 entropy 的時(shí)候旁瘫,它會(huì)放入context內(nèi)容祖凫。

具體實(shí)現(xiàn)細(xì)節(jié),參考
http://www.nltk.org/_modules/nltk/lm/models.html#Lidstone
http://www.nltk.org/_modules/nltk/lm/api.html#LanguageModel
http://www.nltk.org/_modules/nltk/lm/counter.html#NgramCounter
http://www.nltk.org/_modules/nltk/probability.html#FreqDist.freq

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末酬凳,一起剝皮案震驚了整個(gè)濱河市惠况,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宁仔,老刑警劉巖稠屠,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異翎苫,居然都是意外死亡权埠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門煎谍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)攘蔽,“玉大人,你說(shuō)我怎么就攤上這事呐粘÷祝” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵作岖,是天一觀的道長(zhǎng)唆垃。 經(jīng)常有香客問(wèn)我,道長(zhǎng)痘儡,這世上最難降的妖魔是什么降盹? 我笑而不...
    開(kāi)封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上蓄坏,老公的妹妹穿的比我還像新娘价捧。我一直安慰自己,他們只是感情好涡戳,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布结蟋。 她就那樣靜靜地躺著,像睡著了一般渔彰。 火紅的嫁衣襯著肌膚如雪嵌屎。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天恍涂,我揣著相機(jī)與錄音宝惰,去河邊找鬼。 笑死再沧,一個(gè)胖子當(dāng)著我的面吹牛尼夺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炒瘸,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼淤堵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了顷扩?” 一聲冷哼從身側(cè)響起拐邪,我...
    開(kāi)封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隘截,沒(méi)想到半個(gè)月后扎阶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡婶芭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年乘陪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雕擂。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖贱勃,靈堂內(nèi)的尸體忽然破棺而出井赌,到底是詐尸還是另有隱情,我是刑警寧澤贵扰,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布仇穗,位于F島的核電站,受9級(jí)特大地震影響戚绕,放射性物質(zhì)發(fā)生泄漏纹坐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一舞丛、第九天 我趴在偏房一處隱蔽的房頂上張望耘子。 院中可真熱鬧果漾,春花似錦、人聲如沸谷誓。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捍歪。三九已至户辱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間糙臼,已是汗流浹背庐镐。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留变逃,地道東北人必逆。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像韧献,于是被迫代替她去往敵國(guó)和親末患。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 已經(jīng)養(yǎng)成了習(xí)慣,出差的時(shí)候行李箱中一定要放一雙跑鞋渊啰。只要時(shí)間允許探橱,就一定要在去的那個(gè)城市里晨跑。 跑步對(duì)我來(lái)說(shuō)绘证,沒(méi)...
    東里西門行走閱讀 833評(píng)論 1 7
  • 每天在工作生活中忙碌穿梭隧膏,倍感亞歷山大,但我們都知道三角形是最穩(wěn)定的結(jié)構(gòu)嚷那,所以不妨把三角形的家居家飾用品帶回家胞枕,分...
    窗爸爸家居閱讀 276評(píng)論 0 0
  • 此別墅設(shè)計(jì)案例: A484號(hào)別墅設(shè)計(jì)圖紙及效果圖介紹: 占地規(guī)格:門面14.3米X深度12.6米 一層面積:119...
    妮妮別墅閱讀 826評(píng)論 0 0
  • 我和小李是發(fā)小腐泻,從穿開(kāi)襠褲就每天黏在一起。生活在農(nóng)村的我們队询,并沒(méi)有因?yàn)槲镔|(zhì)條件的差異而影響我們的關(guān)系派桩,我們一直...
    榮草閱讀 202評(píng)論 0 0