Nltk: NgramModel λ°±μ˜€ν”„ ν‰ν™œν™” 계산에 였λ₯˜κ°€ μžˆμŠ΅λ‹ˆκΉŒ?

에 λ§Œλ“  2013λ…„ 03μ›” 07일  Β·  18μ½”λ©˜νŠΈ  Β·  좜처: nltk/nltk

NgramModelμ—μ„œ λ°±μ˜€ν”„ ν‰ν™œμ„ κ³„μ‚°ν•˜λŠ” 방법에 였λ₯˜κ°€ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

  • "단어"의 μ‹œν€€μŠ€λ₯Ό κ³ λ €ν•˜μ‹­μ‹œμ˜€. aaaababaaccbacb 단어와 ['a','b','c']
  • λ°”μ΄κ·Έλž¨ λͺ¨λΈμ„ κ΅¬μΆ•ν•©λ‹ˆλ‹€(n=2). λ‹¨μˆœν™”λ₯Ό μœ„ν•΄ LidstoneProbDist μŠ€λ¬΄λ”©μ„ μ‚¬μš©ν•˜μ‹­μ‹œμ˜€.
  • 특히, 이 μ‹œν€€μŠ€μ—λŠ” 'b' λ˜λŠ” 'c' 접두사가 뢙은 λͺ¨λ“  bigram이 ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λΉ…κ·Έλž¨ 'bb', 'bc' 및 'ca'의 ν™•λ₯ μ„ μ–»μœΌλ €λ©΄ λ°±μ˜€ν”„κ°€ ν•„μš”ν•©λ‹ˆλ‹€.
  • context = ['a']의 경우 model.prob(w,context)λŠ” λͺ¨λ“  단어에 μ ν•©ν•˜λ©° ν•©κ³„λŠ” 1μž…λ‹ˆλ‹€.
  • context = ['b']의 경우 model.prob(w,context)κ°€ μ˜¬λ°”λ₯΄κ²Œ 보이지 μ•ŠμœΌλ©° ν•©κ³„λŠ” > 1μž…λ‹ˆλ‹€.

λ°±μ˜€ν”„ 계산은 μ»¨ν…μŠ€νŠΈ 'b'에 λŒ€ν•΄ λ‹€μŒμ„ μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

  • bigram μˆ˜μ€€μ—μ„œ 'b' μ»¨ν…μŠ€νŠΈ(예: bb 및 bc)μ—μ„œ 보이지 μ•ŠλŠ” 값에 λŒ€ν•œ 총 "λˆ„λ½" ν™•λ₯ μ„ κ³„μ‚°ν•˜κ³  이λ₯Ό Beta2라고 ν•©λ‹ˆλ‹€.
  • μ΄λŸ¬ν•œ 보이지 μ•ŠλŠ” κ°’(예: 'b' 및 'c')에 λŒ€ν•œ 총 μœ λ‹ˆκ·Έλž¨ ν™•λ₯ μ„ κ³„μ‚°ν•˜κ³  이λ₯Ό Beta1이라고 ν•©λ‹ˆλ‹€.
  • λ°˜ν™˜(베타2 / 베타1) * backoff.prob()

이것은 본질적으둜 λΉ…κ·Έλž¨ μ»¨ν…μŠ€νŠΈμ—μ„œ κ΄€μ°°λ˜μ§€ μ•Šμ€ 단어에 λŒ€ν•œ μœ λ‹ˆκ·Έλž¨ ν™•λ₯ μ„ μ μ ˆν•˜κ²Œ μ‘°μ •ν•˜μ—¬ λˆ„λ½λœ ν™•λ₯  μ§ˆλŸ‰μ„ μ±„μ›λ‹ˆλ‹€.

λ‚΄κ°€ λ­”κ°€λ₯Ό λ†“μΉ˜κ³  μžˆμŠ΅λ‹ˆκΉŒ? NgramModel의 μ½”λ“œλŠ” 보기에 λ‹€μ†Œ λ‹€λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©° 이해할 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

language-model

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

2016년에 λ“€μ–΄μ„œλ©΄μ„œ 'ngram λͺ¨λΈ' λ¬Έμ œλŠ” 별 진전이 μ—†μ—ˆλ‹€.

λͺ¨λ“  18 λŒ“κΈ€

λ‚˜λŠ” 이것이 μ‹€μ œλ‘œ 버그라고 당신이 μ˜³λ‹€κ³  λ―ΏμŠ΅λ‹ˆλ‹€.

이 섀정을 κ°€μ •ν•˜λ©΄:

from nltk.model import NgramModel
from nltk.probability import LidstoneProbDist

word_seq = list('aaaababaaccbacb')
words = ['a', 'b', 'c', '']

est = lambda freqdist, bins: LidstoneProbDist(freqdist, 0.2, bins=bins)
model = NgramModel(2, word_seq, True, True, est, 4)

μš°λ¦¬λŠ” 맀우 λΉ λ₯΄κ²Œ 뢈일치λ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

sum(model.prob(w, ['b']) for w in words)
Out[150]: 2.4583333333333335
sum(model.prob(w, ['a']) for w in words)
Out[151]: 1.0

[(w, model.prob(w, ['b'])) for w in words]
Out[152]: 
[('a', 0.6666666666666667),
 ('b', 0.875),
 ('c', 0.6666666666666667),
 ('', 0.25)]

[(w, model.prob(w, ['a'])) for w in words]
Out[153]: 
[('a', 0.47727272727272724),
 ('b', 0.25),
 ('c', 0.25),
 ('', 0.022727272727272728)]

μ–Όλ§ˆ 전에 NgramModel을 μž‘μ—…ν•  λ•Œ λ°±μ˜€ν”„κ°€ κ΅¬ν˜„λ˜λŠ” 방식이 μ•½κ°„ ν˜Όλž€μŠ€λŸ¬μ› λ˜ 기얡이 μžˆμŠ΅λ‹ˆλ‹€. μ˜€λž«λ™μ•ˆ 그것을 보지 μ•Šμ•˜κΈ° λ•Œλ¬Έμ— μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ μ§κ΄€μ μœΌλ‘œ μ΄ν•΄ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. μš°λ¦¬κ°€ Katz Back-offλ₯Ό κ΅¬ν˜„ν•˜κ³  μžˆλ‹€κ³  μ£Όμž₯ν•˜μ§€λ§Œ 계산은 Wikipedia 의 계산과 μ•½κ°„ λ‹€λ¦…λ‹ˆλ‹€.

NgramModel._beta μ—μ„œ ν˜ΈμΆœλ˜λŠ” LidstoneProbDist.discount ν•¨μˆ˜κ°€ 이미 합산을 κ³ λ €ν•˜κ³  있기 λ•Œλ¬Έμ΄λΌκ³  μƒκ°ν•˜μ§€λ§Œ 더 μ‚΄νŽ΄λ΄μ•Ό ν•©λ‹ˆλ‹€.

def _alpha(self, tokens):
    return self._beta(tokens) / self._backoff._beta(tokens[1:])

def _beta(self, tokens):
    return (self[tokens].discount() if tokens in self else 1)

λ‚΄κ°€ 보기에 베타 계산은 일이 잘λͺ»λ˜κ³  μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ λ°”μ΄κ·Έλž¨ μˆ˜μ€€μ˜ 베타가 μœ λ‹ˆκ·Έλž¨ μˆ˜μ€€μ˜ 베타보닀 훨씬 μ»€μ„œ λΉ„μœ¨ μ•ŒνŒŒλ₯Ό μ–‘μˆ˜λ‘œ λ§Œλ“€κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

model._beta(('b',))
Out[154]: 0.16666666666666669
model._backoff._beta(())
Out[155]: 0.05063291139240506
model._alpha(('b',))
Out[155]: 3.291666666666667

λ‚˜λŠ” λ˜ν•œ λ¬Έμ œκ°€ μžˆλŠ” μ‹€μ œ LidstoneProbDist μžμ²΄μž„μ„ λ°°μ œν–ˆμŠ΅λ‹ˆλ‹€.

[(w, model._model[('b',)].prob(w)) for w in words]
Out[159]: 
[('a', 0.6666666666666667),
 ('b', 0.04166666666666667),
 ('c', 0.04166666666666667),
 ('', 0.25)]

sum([model._model[('b',)].prob(w) for w in words])
Out[161]: 1.0

이 λͺ¨λ“  뢀뢄이 μ–΄λ–»κ²Œ λ‹€μ‹œ μ—°κ²°λ˜λŠ”μ§€ μ•Œμ•„λ‚΄κ³  이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ”μ§€ ν™•μΈν•˜λ €κ³  ν•©λ‹ˆλ‹€. λ‹€λ₯Έ μ‚¬λžŒμ΄ @desilinguist와 같이 λ›°μ–΄λ“€κ³  μ‹Άμ–΄ν•˜λ”λΌλ„ 이에 λŒ€ν•œ λ‹€λ₯Έ μ‹œκ°μ„ μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš”. 확인해 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. λͺ‡ κ°€μ§€λ§Œ 더 μƒκ°ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

첫째, ν˜Όλž€μŠ€λŸ¬μš΄ ν•œ κ°€μ§€λŠ” "할인"의 λ‹€λ₯Έ κ°œλ…μž…λ‹ˆλ‹€. λ‹€μ–‘ν•œ ν‰ν™œν™” 방법에 μ˜ν•΄ λ‹¬μ„±λ˜λŠ” 할인이 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹¨μˆœ Laplacian(1 μΆ”κ°€) ν‰ν™œν™”λŠ” κ΄€μ°°λœ λ‹¨μ–΄μ˜ ν™•λ₯ μ„ ν• μΈν•˜κ³  ν•΄λ‹Ή μ§ˆλŸ‰μ„ κ΄€μ°°λ˜μ§€ μ•Šμ€ λ‹¨μ–΄λ‘œ μ΄λ™ν•©λ‹ˆλ‹€. _beta ν•¨μˆ˜μ—μ„œ ν˜ΈμΆœλ˜λŠ” discount() ν•¨μˆ˜λŠ” ProbDist에 μ˜ν•΄ μˆ˜ν–‰λ˜λŠ” ν‰ν™œν™”λ₯Ό μœ„ν•œ 것이며 λ°±μ˜€ν”„ ν‰ν™œν™”μ™€ 관련이 μ—†λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 할인에 λŒ€ν•œ λ°±μ˜€ν”„ κ°œλ…μ€ κ³ μ°¨ λͺ¨λΈμ˜ λ‹€λ₯Έ μ»¨ν…μŠ€νŠΈμ— λŒ€ν•΄ "λˆ„λ½"(κ΄€μ°°λ˜μ§€ μ•ŠμŒ)된 단어 ν•˜μœ„ μ§‘ν•©μ˜ ν™•λ₯ κ³Ό 관련이 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

κ·Έλž˜μ„œ μ €λŠ” 제 λͺ©μ μ— 맞게 μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ—¬ μ œκ°€ μ˜³λ‹€κ³  μƒκ°ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν–ˆμœΌλ©° μ•„λž˜μ—μ„œ 일뢀 μŠ€λ‹ˆνŽ«μ„ κ³΅μœ ν–ˆμŠ΅λ‹ˆλ‹€. 기본적으둜 주어진 μ»¨ν…μŠ€νŠΈμ— λŒ€ν•œ λͺ¨λΈμ—μ„œ λˆ„λ½λœ λ‹¨μ–΄μ˜ ν•˜μœ„ 집합을 μ‹λ³„ν•˜κ³  ν•΄λ‹Ή ν•˜μœ„ 집합에 λŒ€ν•΄ μ΄λŸ¬ν•œ "λˆ„λ½λœ" λ‹¨μ–΄μ˜ 총 ν™•λ₯ κ³Ό λ°±μ˜€ν”„ λͺ¨λΈμ˜ ν•΄λ‹Ή μˆ˜λŸ‰μ„ κ³„μ‚°ν•©λ‹ˆλ‹€. λΉ„μœ¨μ€ "μ•ŒνŒŒ"이며 이것은 μ»¨ν…μŠ€νŠΈμ˜ ν•¨μˆ˜μž…λ‹ˆλ‹€. λ‚˜λŠ” 이 κ΅¬ν˜„μ΄ 당신이 μ œκ³΅ν•œ Wikipedia 링크에 μžˆλŠ” 것과 μΌμΉ˜ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. λ˜ν•œ 제 κ²½μš°μ—λŠ” _beta ν•¨μˆ˜λ₯Ό 더 이상 μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이것이 토둠에 μœ μš©ν•˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€. λ‹€μ‹œ ν•œλ²ˆ κ°μ‚¬ν•©λ‹ˆλ‹€.

    # (Code fragment for calculating backoff)

    # Now, for Katz backoff smoothing we need to calculate the alphas
    if self._backoff is not None:
        self._backoff_alphas = dict()

        # For each condition (or context)
        for ctxt in self._cfd.conditions():
            pd = self._model[ctxt] # prob dist for this context

            backoff_ctxt = ctxt[1:]
            backoff_total_pr = 0
            total_observed_pr = 0
            for word in self._cfd[ctxt].keys(): # this is the subset of words that we OBSERVED
                backoff_total_pr += self._backoff.prob(word,backoff_ctxt) 
                total_observed_pr += pd.prob(word)

            assert total_observed_pr <= 1 and total_observed_pr > 0
            assert backoff_total_pr <= 1 and backoff_total_pr > 0

            alpha_ctxt = (1.0-total_observed_pr) / (1.0-backoff_total_pr)

            self._backoff_alphas[ctxt] = alpha_ctxt

# Updated _alpha function, discarded the _beta function
def _alpha(self, tokens):
    """Get the backoff alpha value for the given context
    """
    if tokens in self._backoff_alphas:
        return self._backoff_alphas[tokens]
    else:
        return 1

μ•ˆλ…•ν•˜μ„Έμš” μ—¬λŸ¬λΆ„, μ €λŠ” 이 토둠에 μ°Έμ—¬ν•˜κ³  μ‹Άμ—ˆκ³ , λ¬Έμ œκ°€ λ‹¨μˆœνžˆ 1.0이 λ˜μ§€ μ•Šμ„ ν™•λ₯ μ„ κ°–λŠ” 것보닀 훨씬 더 λ‚˜μ˜λ‹€λŠ” 점을 μ§€μ ν•˜κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ 트라이그램 예λ₯Ό κ³ λ €ν•˜μ‹­μ‹œμ˜€.

#!/usr/bin/python
from nltk.model import NgramModel
from nltk.probability import LidstoneProbDist

word_seq = ['foo', 'foo', 'foo', 'foo', 'bar', 'baz']

# Set up a trigram model, nothing special  
est = lambda freqdist, bins: LidstoneProbDist(freqdist, 0.2, bins)
model = NgramModel(3, word_seq, True, True, est, 3)

# Consider the ngram ['bar', 'baz', 'foo']
# We've never seen this before, so the trigram model will fall back
context = ('bar', 'baz',)
word = 'foo'
print "P(foo | bar, baz) = " + str(model.prob(word,context))

# Result:
# P(foo | bar, baz) = 2.625

예 -- 이 쑰건뢀 ν™•λ₯ μ€ > 1.0μž…λ‹ˆλ‹€.

λΆˆμΎŒν•œ 뢀뢄은 λͺ¨λΈμ΄ λ’€λ‘œ λ¬ΌλŸ¬λ‚ μˆ˜λ‘ ν™•λ₯ μ΄ 더 λΆ€ν’€λ €μ§„λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

더 λ§Žμ€ ν›ˆλ ¨ 예제λ₯Ό μΆ”κ°€ν• μˆ˜λ‘ λ¬Έμ œλŠ” λ”μš± μ•…ν™”λ©λ‹ˆλ‹€!

word_seq = ['foo' for i in range(0,10000)]
word_seq.append('bar')
word_seq.append('baz')

est = lambda freqdist, bins: LidstoneProbDist(freqdist, 0.2, bins)
model = NgramModel(3, word_seq, True, True, est, 3)

# Consider the ngram ['bar', 'baz', 'foo']
# We've never seen this before, so the trigram model will fall back
context = ('bar', 'baz',)
word = 'foo'
print "P(foo | bar, baz) = " + str(model.prob(word,context))

# Result:
P(foo | bar, baz) = 6250.125

ν˜„μž¬ μƒνƒœλ‘œ NgramModel은 μ‹ λ’°ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

@afourney : 이것이 μ˜λ„λœ 것이라고 μƒκ°ν•©λ‹ˆλ‹€(LidstoneProbDistμ—λŠ” SUM_TO_ONE = False 속성이 μžˆμŠ΅λ‹ˆλ‹€)

@afourney 이 λ¬Έμ œκ°€ 해결될 λ•ŒκΉŒμ§€ NgramModel을 μ‹€μ œλ‘œ μ‚¬μš©ν•  수 μ—†λ‹€λŠ” 데 λ™μ˜ν•©λ‹ˆλ‹€. λΆˆν–‰νžˆλ„, λ‚˜λŠ” μ΅œκ·Όμ— 이것을 μ°”λŸ¬λ³Ό μ‹œκ°„μ΄ μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

@kmike SUM_TO_ONE은 LidstoneProbDist에 λŒ€ν•΄ Falseμž…λ‹ˆλ‹€. 초기 배포에 μ—†λŠ” μ΄λ²€νŠΈκ°€ λ°œμƒν•˜κ³  bins 값을 κ°€λŠ₯ν•œ 이벀트 수둜 μ„€μ •ν•˜μ§€ μ•Šμ€ 경우 합이 1이 λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ μ ˆν•˜κ²Œ μ‚¬μš©ν•˜λ©΄ μ‹€μ œλ‘œ 합이 ν•˜λ‚˜λ‘œ λ©λ‹ˆλ‹€. μ—¬κΈ°μ„œ λ¬Έμ œλŠ” LidstoneProbDist μžμ²΄κ°€ μ•„λ‹ˆλΌ NgramModel의 베타 κ³„μ‚°μž…λ‹ˆλ‹€.

@kmike : 예, SUM_TO_ONE이 κ±°μ§“μž„μ„ μ•Œμ•„μ°¨λ ΈμŠ΅λ‹ˆλ‹€. λ‚΄ μš°λ €λŠ” λͺ¨λΈμ΄ 합계에 ν†΅ν•©ν•˜κΈ° 전에 이미 1보닀 큰 κ°œλ³„ 쑰건뢀 ν™•λ₯ (단일 이벀트의 경우)을 λ°˜ν™˜ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

@bcroy κ·€ν•˜μ˜ μ†”λ£¨μ…˜μ΄ μ˜¬λ°”λ₯Έ μ ‘κ·Ό 방식이라고 μƒκ°ν•©λ‹ˆλ‹€. κ°„λ‹¨νžˆ λ§ν•΄μ„œ _alphaλŠ” 두 가지 μ€‘μš”ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  1. ν˜„μž¬ κ³ μ°¨ λͺ¨λΈμ— μ˜ν•΄ 이미 μ„€λͺ…λœ 단어λ₯Ό μ œμ™Έν•˜κΈ° μœ„ν•΄ 주어진 μ»¨ν…μŠ€νŠΈμ— λŒ€ν•œ λ°±μ˜€ν”„ λͺ¨λΈμ„ μž¬μ •κ·œν™”ν•©λ‹ˆλ‹€.
  2. μž¬μ •κ·œν™”λœ λ°±μ˜€ν”„ λͺ¨λΈμ„ ν˜„μž¬ _model의 "λˆ„λ½"/ν• μΈλœ ν™•λ₯ μ— "적합"ν•˜λ„λ‘ μ‘°μ •ν•©λ‹ˆλ‹€.

즉, NgramModel이 λ°±μ˜€ν”„ μ „λž΅μ˜ λŒ€μ•ˆμœΌλ‘œ 보간 μ „λž΅λ„ μ œκ³΅ν•˜λ©΄ 쒋을 κ²ƒμž…λ‹ˆλ‹€. 이것은 Jelinek-Mercer λ˜λŠ” Witten-Bell ν‰ν™œν™”μ— λŒ€ν•œ 지원을 κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€. ν›„μžλŠ” κ°„λ‹¨ν•˜κ³  맀우 잘 μž‘λ™ν•©λ‹ˆλ‹€. μ°Έμ‘°: http://nlp.stanford.edu/~wcmac/papers/20050421-smoothing-tutorial.pdf

λˆ„κ΅°κ°€ 이것이 μ—¬μ „νžˆ 곡개 버그인지 확인할 수 μžˆμŠ΅λ‹ˆκΉŒ?

예, μ—¬μ „νžˆ P(foo | bar, baz) = 2.625λ₯Ό μ–»κ³  μžˆμŠ΅λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” μ—¬λŸ¬λΆ„,

이 λ¬Έμ œμ— 진전이 μžˆμŠ΅λ‹ˆκΉŒ? 아직 μ˜€ν”ˆ λ²„κ·ΈμΈκ°€μš”? λ‚˜λŠ” P(foo | bar, baz) = 2.625λ₯Ό μ–»κ³  μžˆμœΌλ―€λ‘œ λ¬Έμ œκ°€ κ³„μ†λ©λ‹ˆλ‹€.

NLP의 거의 λͺ¨λ“  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ–Έμ–΄ λͺ¨λΈμ΄ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— 이것이 μ€‘μš”ν•œ 문제이고 μˆ˜μ •λ˜μ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

λΆˆν–‰νžˆλ„ μ €λŠ” NgramModel 의 μˆ˜λ§Žμ€ 문제λ₯Ό μ‚΄νŽ΄λ³Ό μ‹œκ°„μ΄ μ—†μ—ˆκ³  μ‘°λ§Œκ°„ κ·Έλ ‡κ²Œ ν•  수 μžˆμ„ 것이라고 μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λˆ„κ΅°κ°€ 이 버그λ₯Ό λ‹€λ£° λ•ŒκΉŒμ§€ NgramModel λŠ” nltkμ—μ„œ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λŒ„, λ‹΅λ³€ κ°μ‚¬ν•©λ‹ˆλ‹€.

μ—…λ°μ΄νŠΈλ₯Ό ν™•μΈν•˜λŠ” μ€‘μž…λ‹ˆλ‹€. 일뢀 λ¬Έμ œκ°€ μ’…λ£Œλœ 것을 λ³Ό 수 μžˆμ§€λ§Œ 아직 μ‚¬μš©ν•  수 μ—†λŠ”μ§€ ν™•μΈν•˜κ³  μ‹ΆμŠ΅λ‹ˆκΉŒ?

@ZeerakW λΆˆν–‰νžˆλ„ ngram λͺ¨λΈμ—λŠ” 거의 진전이 μ—†μ—ˆκ³  아무도 아직 이λ₯Ό ν•΄κ²°ν•˜κΈ°λ‘œ μ•½μ†ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

2016년에 λ“€μ–΄μ„œλ©΄μ„œ 'ngram λͺ¨λΈ' λ¬Έμ œλŠ” 별 진전이 μ—†μ—ˆλ‹€.

μ—¬λŸ¬λΆ„, μš°λ¦¬λŠ” λ§ˆμΉ¨λ‚΄ 이것을 닫을 수 μžˆμŠ΅λ‹ˆλ‹€ :)

μ—…λ°μ΄νŠΈ 2018. 이미 μ‘Έμ—…ν•˜κ³  μž‘μ—…μ„ μ‹œμž‘ν–ˆμ§€λ§Œ μ—¬μ „νžˆ Ngram λ¬Έμ œκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€.

여름!

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰