Nltk: Π‘Ρ‚Ρ€Π°Π½Π½Ρ‹ΠΉ ΠΊΡ€Π°ΠΉΠ½ΠΈΠΉ случай для ΠΎΡ†Π΅Π½ΠΊΠΈ bleu.

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 25 сСнт. 2017  Β·  17ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: nltk/nltk

Π•ΡΡ‚ΡŒ нСинтуитивная Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ модуля bleu_score.

>>> bleu_score.sentence_bleu([[1,2,3,4]],[5,6,8,1], weights=(0.5, 0.5)) 
0.5
>>> bleu_score.sentence_bleu([[1,2,3,4]],[5,6,1,2], weights=(0.5, 0.5))
0.408248290463863
>>> bleu_score.sentence_bleu([[1,2,3,4]],[5,6,2,3], weights=(0, 0.5))
0.5773502691896257
>>> bleu_score.sentence_bleu([[1,2,3,4]],[5,6,7,3], weights=(0, 0.5))
1.0
>>> bleu_score.sentence_bleu([[1,2,3,4]],[5,6,8,7], weights=(0, 0.5))
0

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ SmoothingFunction.method0 пропускаСт Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΠΎΠ±ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π²Π½Ρ‹ Π½ΡƒΠ»ΡŽ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΡ†Π΅Π½ΠΊΡƒ bleu Π² этих случаях ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятной. На ΠΌΠΎΠΉ взгляд, Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятно, Ссли Π±Ρ‹ log (0) ΠΎΡ†Π΅Π½ΠΈΠ²Π°Π» Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -inf, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ ΠΎΠ±Ρ‰ΠΈΠΉ Π±Π°Π»Π» bleu Π² этих случаях оцСнивался Π² 0. Π­Ρ‚ΠΎ вмСстС с Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅Ρ‚ΠΊΠΈΠΌ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ сдСлало Π±Ρ‹ это Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅, ΠΎΠ½ Π΄Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ высокий bleu для Ρ…ΡƒΠ΄ΡˆΠ΅Π³ΠΎ совпадСния, ΠΊΠΎΠ³Π΄Π° я ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±Π°Π»Π» bleu 0.

>>> bleu_score.sentence_bleu([[1,2,3,4]],[5,6,8,1], weights=(0.5, 0.5))
0.5
>>> bleu_score.sentence_bleu([[1,2,3,4]],[5,6,1,2], weights=(0.5, 0.5))
0.408248290463863
SMT documentation resolved

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ. Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ²Ρ‹ Π²Ρ‹Ρ…ΠΎΠ΄Ρ‹:

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ нСсглаТСнный BLEU Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ прСдназначался для ΠΎΡ†Π΅Π½ΠΊΠΈ уровня прСдлоТСния, рСкомСндуСтся Π½Π°ΠΉΡ‚ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ сглаТивания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ трСбуСтся вашим Π΄Π°Π½Π½Ρ‹ΠΌ, поТалуйста, посмотритС https://github.com/alvations/nltk/blob/develop/ nltk / translate / bleu_score.py # L425

Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ шаг, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ сглаТиваниС, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Π°ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ сцСнарий, ΠΊΠΎΠ³Π΄Π° ваш порядок n-Π³Ρ€Π°ΠΌΠΌΠΎΠ² большС, Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ сущСствуСт ΠΌΠ΅ΠΆΠ΄Ρƒ ссылкой ΠΈ Π³ΠΈΠΏΠΎΡ‚Π΅Π·ΠΎΠΉ, BLEU корпуса / прСдлоТСния Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² этом случаС. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ этого Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ приняты Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅:

>>> from nltk.translate.bleu_score import sentence_bleu
>>> sentence_bleu([[1,2,3,4]],[5,6,8,1], weights=(0.5, 0.5)) 
/usr/local/lib/python2.7/site-packages/nltk/translate/bleu_score.py:490: UserWarning: 
Corpus/Sentence contains 0 counts of 2-gram overlaps.
BLEU scores might be undesirable; use SmoothingFunction().
  warnings.warn(_msg)
0.5

Π”Π°Π»Π΅Π΅ Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ сущСствуСт 1 Π±ΠΈΠ³Ρ€Π°ΠΌΠΌΠ°, Π° 2 ΡƒΠ½ΠΈΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ ссылку ΠΈ Π³ΠΈΠΏΠΎΡ‚Π΅Π·Ρƒ. ΠŸΠΎΡ…ΠΎΠΆΠ΅, ΠΎΠ½ Π΄Π°Π΅Ρ‚ Ρ€Π°Π·ΡƒΠΌΠ½ΡƒΡŽ ΠΎΡ†Π΅Π½ΠΊΡƒ.

>>> sentence_bleu([[1,2,3,4]],[5,6,1,2], weights=(0.5, 0.5))
0.408248290463863

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ с использованиСм weights=(0, 0.5) , это довольно Π½Π΅ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅ присвоСниС ΠΎΡ†Π΅Π½ΠΎΠΊ для Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΈΡ… n-Π³Ρ€Π°ΠΌΠΌΠΎΠ² ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠΎΡ€Π°ΠΆΠ΅Π½ΠΈΡŽ Ρ†Π΅Π»ΠΈ BLEU, Π³Π΄Π΅ ΠΌΡ‹ сопоставляСм гСомСтричСски ΠΏΠΎ порядку n-Π³Ρ€Π°ΠΌΠΌΠΎΠ². Но Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим:

>>> sentence_bleu([[1,2,3,4]],[5,6,2,3], weights=(0, 0.5))
0.5773502691896257

ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ Π½Π΅Π³ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ совпадСния 1 Π±ΠΈΠ³Ρ€Π°ΠΌΠΌ ΠΈ 2 ΡƒΠ½ΠΈΠ³Ρ€Π°ΠΌΠΌ, Π½ΠΎ Ρƒ Π½Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ высокий Π±Π°Π»Π». И это ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ взвСшиваСм Π±ΠΈΠ³Ρ€Π°ΠΌΠΌΡ‹ тяТСлСС, Ρ‡Π΅ΠΌ ΡƒΠ½ΠΈΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈ Ρƒ ΡƒΠ½ΠΈΠ³Ρ€Π°ΠΌΠΌΠΎΠ² отсутствуСт влияниС. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±ΠΈΠ³Ρ€Π°ΠΌΠΌ мСньшС, Ρ‡Π΅ΠΌ ΡƒΠ½ΠΈΠ³Ρ€Π°ΠΌΠΌ, СстСствСнно, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ BLEU Π²Ρ‹ΡˆΠ΅.

>>> import math
>>> from nltk import ngrams
>>> from nltk.translate.bleu_score import modified_precision

>>> ref, hyp = [1,2,3,4], [5,6,2,3]

>>> list(ngrams(ref, 2)) # 3 bigrams.
[(1, 2), (2, 3), (3, 4)]
>>> list(ngrams(ref, 1)) # 4 unigrams.
[(1,), (2,), (3,), (4,)] 

ОписаниС большСго количСства совпадСний = Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° BLEU ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятно, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π°ΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠΈ BLEU, ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½Π½ΠΎΠΉ Π² ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠΉ точности:

>>> modified_precision([ref], hyp, 2)
Fraction(1, 3)
>>> modified_precision([ref], hyp, 1) 
Fraction(2, 4)

>>> m1 = modified_precision([ref], hyp, 1)
>>> m2 = modified_precision([ref], hyp, 2)

Если ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ срСднСму гСомСтричСскому логарифмичСскому, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ измСнСнная Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ искаТаСтся:

>>> import math
>>> math.log(m1)
-0.6931471805599453
>>> math.log(m2)

-1.0986122886681098
>>> math.exp(0.5 * math.log(m1) + 0.5 * math.log(m2))
0.408248290463863
>>> math.exp(0 * math.log(m1) + 0.5 * math.log(m2))
0.5773502691896257

Π˜Ρ‚Π°ΠΊ, ΠΈΠ· ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Ρ‚Ρ€Π΅Ρ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Π°ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ нСдСйствитСлСн (ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅), Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ нСпростыми для понимания, Π½ΠΎ ΠΎΠ½ΠΈ матСматичСски Π²Π΅Ρ€Π½Ρ‹:

>>> sentence_bleu([[1,2,3,4]],[5,6,8,1], weights=(0.5, 0.5)) 
0.5
>>> sentence_bleu([[1,2,3,4]],[5,6,1,2], weights=(0.5, 0.5))
0.408248290463863
>>> sentence_bleu([[1,2,3,4]],[5,6,2,3], weights=(0, 0.5))
0.5773502691896257

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ я пропустил шаг ΡˆΡ‚Ρ€Π°Ρ„Π° Π·Π° ΠΊΡ€Π°Ρ‚ΠΊΠΎΡΡ‚ΡŒ, Π½ΠΎ ΠΏΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΌΠ½Π΅, это 1.0, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Π»ΠΈΠ½Π° Π³ΠΈΠΏΠΎΡ‚Π΅Π·Ρ‹ такая ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Ρƒ ссылки. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ сСбя Ρ‚ΠΎΠΆΠ΅ =)

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ ΠΊ 4-ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ‚Ρƒ ΠΆΠ΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ, Π° Π·Π°Ρ‚Π΅ΠΌ вычисляСм срСдний гСомСтричСский логарифмичСский шаг:

>>> sentence_bleu([[1,2,3,4]],[5,6,7,3], weights=(0, 0.5))
/Users/liling.tan/git-stuff/nltk-alvas/nltk/translate/bleu_score.py:491: UserWarning: 
Corpus/Sentence contains 0 counts of 2-gram overlaps.
BLEU scores might be undesirable; use SmoothingFunction().
  warnings.warn(_msg)
1.0

>>> ref, hyp = [1,2,3,4], [5,6,7,3]
>>> modified_precision([ref], hyp, 1)
Fraction(1, 4)
>>> modified_precision([ref], hyp, 2)
Fraction(0, 3)
>>> m1 = modified_precision([ref], hyp, 1)
>>> m2 = modified_precision([ref], hyp, 2)

>>> math.exp(0 * math.log(m1) + 0.5 * math.log(m2))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: math domain error

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, использованиС bigram BLEU Ρ‚Π°ΠΊΠΆΠ΅ нСдопустимо Π±Π΅Π· Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сглаТивания.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π»ΠΎΡΡŒ ΠΏΡ€ΠΈ использовании BLEU, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ установлСн ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ идСя ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΎ ΠΎΠ½ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π΄Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ слишком часто появляСтся Π² ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½ΠΎΠΌ Π½Π°Π±ΠΎΡ€Π΅ Π΄Π°Π½Π½Ρ‹Ρ….

ПослСдний ΠΏΡ€ΠΈΠΌΠ΅Ρ€ дСйствитСлСн, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 для 0 ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΉ ΡƒΠ½ΠΈΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ ΠΈΡ‚ΠΎΠ³Π΅:

>>> import warnings
>>> warnings.simplefilter("always")

>>> from nltk.translate.bleu_score import sentence_bleu

# Invalid use of BLEU.
>>> sentence_bleu([[1,2,3,4]],[5,6,8,1], weights=(0.5, 0.5)) 
/Users/liling.tan/git-stuff/nltk-alvas/nltk/translate/bleu_score.py:491: UserWarning: 
Corpus/Sentence contains 0 counts of 2-gram overlaps.
BLEU scores might be undesirable; use SmoothingFunction().
  warnings.warn(_msg)
0.5

# Valid BLEU score.
>>> sentence_bleu([[1,2,3,4]],[5,6,1,2], weights=(0.5, 0.5))
0.408248290463863

# Logical BLEU score.
>>> sentence_bleu([[1,2,3,4]],[5,6,2,3], weights=(0, 0.5)) 
0.5773502691896257

# Invalid use of BLEU.
>>> sentence_bleu([[1,2,3,4]],[5,6,7,3], weights=(0, 0.5))
/Users/liling.tan/git-stuff/nltk-alvas/nltk/translate/bleu_score.py:491: UserWarning: 
Corpus/Sentence contains 0 counts of 2-gram overlaps.
BLEU scores might be undesirable; use SmoothingFunction().
  warnings.warn(_msg)
1.0

# Valid BLEU score.
>>> sentence_bleu([[1,2,3,4]],[5,6,8,7], weights=(0, 0.5))
0

ВсС 17 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠŸΡ€ΠΎΡΡ‚ΠΎ ΡƒΡ‚ΠΎΡ‡Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠ³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒΡΡ Π² подробности. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚Π΅ эти второстСпСнныС случаи?

Π”Π°, я ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅.

Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ. Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ²Ρ‹ Π²Ρ‹Ρ…ΠΎΠ΄Ρ‹:

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ нСсглаТСнный BLEU Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ прСдназначался для ΠΎΡ†Π΅Π½ΠΊΠΈ уровня прСдлоТСния, рСкомСндуСтся Π½Π°ΠΉΡ‚ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ сглаТивания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ трСбуСтся вашим Π΄Π°Π½Π½Ρ‹ΠΌ, поТалуйста, посмотритС https://github.com/alvations/nltk/blob/develop/ nltk / translate / bleu_score.py # L425

Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ шаг, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ сглаТиваниС, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Π°ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ сцСнарий, ΠΊΠΎΠ³Π΄Π° ваш порядок n-Π³Ρ€Π°ΠΌΠΌΠΎΠ² большС, Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ сущСствуСт ΠΌΠ΅ΠΆΠ΄Ρƒ ссылкой ΠΈ Π³ΠΈΠΏΠΎΡ‚Π΅Π·ΠΎΠΉ, BLEU корпуса / прСдлоТСния Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² этом случаС. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ этого Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ приняты Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅:

>>> from nltk.translate.bleu_score import sentence_bleu
>>> sentence_bleu([[1,2,3,4]],[5,6,8,1], weights=(0.5, 0.5)) 
/usr/local/lib/python2.7/site-packages/nltk/translate/bleu_score.py:490: UserWarning: 
Corpus/Sentence contains 0 counts of 2-gram overlaps.
BLEU scores might be undesirable; use SmoothingFunction().
  warnings.warn(_msg)
0.5

Π”Π°Π»Π΅Π΅ Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ сущСствуСт 1 Π±ΠΈΠ³Ρ€Π°ΠΌΠΌΠ°, Π° 2 ΡƒΠ½ΠΈΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ ссылку ΠΈ Π³ΠΈΠΏΠΎΡ‚Π΅Π·Ρƒ. ΠŸΠΎΡ…ΠΎΠΆΠ΅, ΠΎΠ½ Π΄Π°Π΅Ρ‚ Ρ€Π°Π·ΡƒΠΌΠ½ΡƒΡŽ ΠΎΡ†Π΅Π½ΠΊΡƒ.

>>> sentence_bleu([[1,2,3,4]],[5,6,1,2], weights=(0.5, 0.5))
0.408248290463863

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ с использованиСм weights=(0, 0.5) , это довольно Π½Π΅ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅ присвоСниС ΠΎΡ†Π΅Π½ΠΎΠΊ для Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΈΡ… n-Π³Ρ€Π°ΠΌΠΌΠΎΠ² ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠΎΡ€Π°ΠΆΠ΅Π½ΠΈΡŽ Ρ†Π΅Π»ΠΈ BLEU, Π³Π΄Π΅ ΠΌΡ‹ сопоставляСм гСомСтричСски ΠΏΠΎ порядку n-Π³Ρ€Π°ΠΌΠΌΠΎΠ². Но Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим:

>>> sentence_bleu([[1,2,3,4]],[5,6,2,3], weights=(0, 0.5))
0.5773502691896257

ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ Π½Π΅Π³ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ совпадСния 1 Π±ΠΈΠ³Ρ€Π°ΠΌΠΌ ΠΈ 2 ΡƒΠ½ΠΈΠ³Ρ€Π°ΠΌΠΌ, Π½ΠΎ Ρƒ Π½Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ высокий Π±Π°Π»Π». И это ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ взвСшиваСм Π±ΠΈΠ³Ρ€Π°ΠΌΠΌΡ‹ тяТСлСС, Ρ‡Π΅ΠΌ ΡƒΠ½ΠΈΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈ Ρƒ ΡƒΠ½ΠΈΠ³Ρ€Π°ΠΌΠΌΠΎΠ² отсутствуСт влияниС. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±ΠΈΠ³Ρ€Π°ΠΌΠΌ мСньшС, Ρ‡Π΅ΠΌ ΡƒΠ½ΠΈΠ³Ρ€Π°ΠΌΠΌ, СстСствСнно, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ BLEU Π²Ρ‹ΡˆΠ΅.

>>> import math
>>> from nltk import ngrams
>>> from nltk.translate.bleu_score import modified_precision

>>> ref, hyp = [1,2,3,4], [5,6,2,3]

>>> list(ngrams(ref, 2)) # 3 bigrams.
[(1, 2), (2, 3), (3, 4)]
>>> list(ngrams(ref, 1)) # 4 unigrams.
[(1,), (2,), (3,), (4,)] 

ОписаниС большСго количСства совпадСний = Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° BLEU ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятно, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π°ΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠΈ BLEU, ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½Π½ΠΎΠΉ Π² ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠΉ точности:

>>> modified_precision([ref], hyp, 2)
Fraction(1, 3)
>>> modified_precision([ref], hyp, 1) 
Fraction(2, 4)

>>> m1 = modified_precision([ref], hyp, 1)
>>> m2 = modified_precision([ref], hyp, 2)

Если ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ срСднСму гСомСтричСскому логарифмичСскому, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ измСнСнная Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ искаТаСтся:

>>> import math
>>> math.log(m1)
-0.6931471805599453
>>> math.log(m2)

-1.0986122886681098
>>> math.exp(0.5 * math.log(m1) + 0.5 * math.log(m2))
0.408248290463863
>>> math.exp(0 * math.log(m1) + 0.5 * math.log(m2))
0.5773502691896257

Π˜Ρ‚Π°ΠΊ, ΠΈΠ· ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Ρ‚Ρ€Π΅Ρ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Π°ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ нСдСйствитСлСн (ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅), Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ нСпростыми для понимания, Π½ΠΎ ΠΎΠ½ΠΈ матСматичСски Π²Π΅Ρ€Π½Ρ‹:

>>> sentence_bleu([[1,2,3,4]],[5,6,8,1], weights=(0.5, 0.5)) 
0.5
>>> sentence_bleu([[1,2,3,4]],[5,6,1,2], weights=(0.5, 0.5))
0.408248290463863
>>> sentence_bleu([[1,2,3,4]],[5,6,2,3], weights=(0, 0.5))
0.5773502691896257

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ я пропустил шаг ΡˆΡ‚Ρ€Π°Ρ„Π° Π·Π° ΠΊΡ€Π°Ρ‚ΠΊΠΎΡΡ‚ΡŒ, Π½ΠΎ ΠΏΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΌΠ½Π΅, это 1.0, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Π»ΠΈΠ½Π° Π³ΠΈΠΏΠΎΡ‚Π΅Π·Ρ‹ такая ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Ρƒ ссылки. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ сСбя Ρ‚ΠΎΠΆΠ΅ =)

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ ΠΊ 4-ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ‚Ρƒ ΠΆΠ΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ, Π° Π·Π°Ρ‚Π΅ΠΌ вычисляСм срСдний гСомСтричСский логарифмичСский шаг:

>>> sentence_bleu([[1,2,3,4]],[5,6,7,3], weights=(0, 0.5))
/Users/liling.tan/git-stuff/nltk-alvas/nltk/translate/bleu_score.py:491: UserWarning: 
Corpus/Sentence contains 0 counts of 2-gram overlaps.
BLEU scores might be undesirable; use SmoothingFunction().
  warnings.warn(_msg)
1.0

>>> ref, hyp = [1,2,3,4], [5,6,7,3]
>>> modified_precision([ref], hyp, 1)
Fraction(1, 4)
>>> modified_precision([ref], hyp, 2)
Fraction(0, 3)
>>> m1 = modified_precision([ref], hyp, 1)
>>> m2 = modified_precision([ref], hyp, 2)

>>> math.exp(0 * math.log(m1) + 0.5 * math.log(m2))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: math domain error

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, использованиС bigram BLEU Ρ‚Π°ΠΊΠΆΠ΅ нСдопустимо Π±Π΅Π· Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сглаТивания.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π»ΠΎΡΡŒ ΠΏΡ€ΠΈ использовании BLEU, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ установлСн ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ идСя ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΎ ΠΎΠ½ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π΄Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ слишком часто появляСтся Π² ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½ΠΎΠΌ Π½Π°Π±ΠΎΡ€Π΅ Π΄Π°Π½Π½Ρ‹Ρ….

ПослСдний ΠΏΡ€ΠΈΠΌΠ΅Ρ€ дСйствитСлСн, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 для 0 ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΉ ΡƒΠ½ΠΈΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ ΠΈΡ‚ΠΎΠ³Π΅:

>>> import warnings
>>> warnings.simplefilter("always")

>>> from nltk.translate.bleu_score import sentence_bleu

# Invalid use of BLEU.
>>> sentence_bleu([[1,2,3,4]],[5,6,8,1], weights=(0.5, 0.5)) 
/Users/liling.tan/git-stuff/nltk-alvas/nltk/translate/bleu_score.py:491: UserWarning: 
Corpus/Sentence contains 0 counts of 2-gram overlaps.
BLEU scores might be undesirable; use SmoothingFunction().
  warnings.warn(_msg)
0.5

# Valid BLEU score.
>>> sentence_bleu([[1,2,3,4]],[5,6,1,2], weights=(0.5, 0.5))
0.408248290463863

# Logical BLEU score.
>>> sentence_bleu([[1,2,3,4]],[5,6,2,3], weights=(0, 0.5)) 
0.5773502691896257

# Invalid use of BLEU.
>>> sentence_bleu([[1,2,3,4]],[5,6,7,3], weights=(0, 0.5))
/Users/liling.tan/git-stuff/nltk-alvas/nltk/translate/bleu_score.py:491: UserWarning: 
Corpus/Sentence contains 0 counts of 2-gram overlaps.
BLEU scores might be undesirable; use SmoothingFunction().
  warnings.warn(_msg)
1.0

# Valid BLEU score.
>>> sentence_bleu([[1,2,3,4]],[5,6,8,7], weights=(0, 0.5))
0

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ послСдним Π΄Π²ΡƒΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌ. На самом Π΄Π΅Π»Π΅, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ экзСмпляр - нСдопустимоС использованиС BLEU, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ это ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ:

>>> from nltk.translate.bleu_score import sentence_bleu

>>> sentence_bleu([[1,2,3,4]],[5,6,8,1], weights=(0.5, 0.5))
/Users/liling.tan/git-stuff/nltk-alvas/nltk/translate/bleu_score.py:491: UserWarning: 
Corpus/Sentence contains 0 counts of 2-gram overlaps.
BLEU scores might be undesirable; use SmoothingFunction().
  warnings.warn(_msg)
0.5

>>> sentence_bleu([[1,2,3,4]],[5,6,1,2], weights=(0.5, 0.5))
0.408248290463863

Всякий Ρ€Π°Π· , ΠΊΠΎΠ³Π΄Π° ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ появляСтся Π² ΠΏ - Π³ΠΎ порядка Ngram (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, Π±ΠΈΠ³Ρ€Π°ΠΌΠΌΡ‹), Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ это Π·Π»ΠΎΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ BLEU , ΠΈ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° счСт вСса ΠΏ-1th порядка (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, Π² ΡŽΠ½ΠΈΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…).

Π˜Ρ‚Π°ΠΊ, Ссли ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с СдинствСнными вСсами для ΡƒΠ½ΠΈΠ³Ρ€Π°ΠΌΠΌΡ‹:

>>> sentence_bleu([[1,2,3,4]],[5,6,8,1], weights=(0,))
1.0

Π‘Ρ€Π΅Π΄Π½Π΅Π΅ гСомСтричСскоС логарифмичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ нСсколько сбиваСт с Ρ‚ΠΎΠ»ΠΊΡƒ, Π½ΠΎ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ΠΊ этому являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ сумма вСсов порядков n-Π³Ρ€Π°ΠΌΠΌΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ 1,0, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ΄Π΅Π΅ BLEU. НапримСр

>>> sentence_bleu([[1,2,3,4]],[5,6,8,1], weights=(1,))
0.25

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° появляСтся ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, это Π½Π΅-BLEU ситуация, ΠΊΠΎΠ³Π΄Π° BLEU Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΈ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… исслСдований, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ эту ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ боль, ΠΊΡ€ΠΎΠΌΠ΅ исслСдоватСлСй, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΡ… Π½ΠΎΠ²Ρ‹Π΅ Β«Π»ΡƒΡ‡ΡˆΠΈΠ΅Β» ΠΎΡ†Π΅Π½ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ахиллСсову пяту.

Π’ случаС, Ссли всплываСт ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ трСбуСтся быстроС исправлСниС, сущСствуСт опция emulate_multibleu Π½ΠΎ вСса Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ установлСны Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ Π΅Π΄ΠΈΠ½Ρ‹ΠΌ вСсам ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для всСх 4-Π³Ρ€Π°ΠΌΠΌΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€

>>> sentence_bleu([[1,2,3,4]],[5,6,8,1], emulate_multibleu=True)
0.0

И Ссли ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ multi-bleu.perl :

$ cat ref 
1 2 3 4
$ cat hyp 
5 6 8 1
$ perl ~/mosesdecoder/scripts/generic/multi-bleu.perl ref < hyp
BLEU = 0.00, 25.0/0.0/0.0/0.0 (BP=1.000, ratio=1.000, hyp_len=4, ref_len=4)

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос:

  • НуТна Π»ΠΈ Π½Π°ΠΌ функция для автоматичСской ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ вСсов, Ссли вСса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π΄Π°ΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ, Π½Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ BLEU? Π’ настоящСС врСмя функция auto_reweigh Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ weights = (0.25, 0.25, 0.25, 0.25) .

    • Π― ΠΏΡ€ΠΎΡ‚ΠΈΠ² этой ΠΈΠ΄Π΅ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ (i) ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ настраиваСмыС вСса, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ BLEU ΠΈ ΠΏΡ€ΠΈ нСобходимости ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ вСса ΠΈ (ii) Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π½Π΅ хотят Ρ…Π»ΠΎΠΏΠΎΡ‚, ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вСса ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ / ΠΈΠ»ΠΈ emulate_multibleu Π²Π°Ρ€ΠΈΠ°Π½Ρ‚
  • Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π»ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ всСгда, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ BLEU?

Если Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ исслСдования ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для этих второстСпСнных случаСв BLEU, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ для ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этих Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ.

Но Ссли это исправлСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ приводят ΠΊ Π±ΠΎΠ»Π΅Π΅ Π΄ΡƒΡ€Π°Ρ†ΠΊΠΎΠΉ ситуации с BLEU , Ρ‚ΠΎ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ тСкущая вСрсия BLEU достаточно ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Π° с прСдупрСТдСниями Π½Π° мСстС =)

@benleetownsend Π― надСюсь, Ρ‡Ρ‚ΠΎ объяснСниС ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ тСкущая рСализация BLEU с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ достаточна для прСодолСния ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Π°ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ².

Π― ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ (i) ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ Π²Π·Π»ΠΎΠΌΠ° вСсов, Ссли Π²Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π΅ΠΎΡ€Π΅Ρ‚ΠΈΠΊΠΎ-ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ для ΠΈΡ… ΠΎΡ†Π΅Π½ΠΊΠΈ, (ii) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ emulate_multibleu=True с вСсами ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (0,25, 0,25, 0,25, 0,25) ΠΈΠ»ΠΈ (iii ) поэкспСримСнтируйтС с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ сглаТивания, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ, Π½ΠΎ всС ΠΆΠ΅ ΠΈΠ·Π±Π΅Π³Π°ΠΉΡ‚Π΅ Π²Π·Π»ΠΎΠΌΠ° вСсов.

Бпасибо Π·Π° ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚. Π― согласСн со всСм, Ρ‡Ρ‚ΠΎ Π²Ρ‹ сказали, ΠΎΠ΄Π½Π°ΠΊΠΎ я полагаю, Ρ‡Ρ‚ΠΎ моя основная Ρ‚ΠΎΡ‡ΠΊΠ° зрСния Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ каТСтся, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ сниТаСтС n-1 Π³Ρ€Π°ΠΌΠΌ, каТутся Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ, ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ я Π²ΠΈΠ΄Π΅Π».

>>> sentence_bleu([[1,2,3,4]],[5,6,8,1], weights=(0.5, 0.5))
/Users/liling.tan/git-stuff/nltk-alvas/nltk/translate/bleu_score.py:491: UserWarning: 
Corpus/Sentence contains 0 counts of 2-gram overlaps.
BLEU scores might be undesirable; use SmoothingFunction().
  warnings.warn(_msg)
0.5

Π’ этом случаС я Π±Ρ‹ сказал, Ρ‡Ρ‚ΠΎ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ BLEU ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ 0 для этого случая Β«Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΒ», Π½ΠΎ Ссли я Π½Π΅ пропустил Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π² Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ 0,5 для этого Π½Π΅Π²Π΅Ρ€Π΅Π½.

Π― Π±Ρ‹ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» Π»ΠΈΠ±ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅Ρ‚ΠΊΠΎΠ΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ говорится, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ (Π° Π½Π΅ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅), Π»ΠΈΠ±ΠΎ установка ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° «сглаТивания» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ sys.float_info.min Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π±Π°Π»Π»Ρƒ bleu 0 ΠΏΡ€ΠΈ «нСдопустимом использовании BLEU. " случаи.

Если Π²Ρ‹ Π½Π΅ согласны, Π·Π°ΠΊΡ€ΠΎΠΉΡ‚Π΅ этот вопрос. Π― Ρ€Π΅ΡˆΠΈΠ» эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π² своСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ настраиваСмой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сглаТивания, содСрТащСй ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π•Ρ‰Π΅ Ρ€Π°Π· спасибо Π·Π° вашС врСмя.

ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ вопросы.

Над ΠΊΠ°ΠΊΠΈΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅? И ΠΊΠ°ΠΊ часто это происходит?

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ сглаТиваниС.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ Ρ‚ΠΎΠΌΡƒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ sys.float_info.min Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π² Π½Π΅ΡΠ³Π»Π°ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ вСрсии BLEU.

Когда ΠΌΡ‹ добавляСм sys.float_info.min ΠΊ точности для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ порядка n-Π³Ρ€Π°ΠΌΠΌΠΎΠ² ΠΊ нСсглаТСнному BLEU , ΠΌΡ‹ тСхничСски обСспСчиваСм сглаТСнный ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ точности, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ лапласу. Π­Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ 1 Π² https://github.com/nltk/nltk/blob/develop/nltk/translate/bleu_score.py#L496

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сглаТСнного BLEU:

>>> from nltk.translate.bleu_score import sentence_bleu
>>> from nltk.translate.bleu_score import SmoothingFunction
>>> import sys

>>> smoother = SmoothingFunction()

# Laplacian smoothing.
>>> sentence_bleu([[1,2,3,4]],[5,6,8,1], smoothing_function=smoother.method1)
0.08034284189446518

# Laplacian smoothing, with altered weights.
>>> sentence_bleu([[1,2,3,4]],[5,6,8,1], weights=(0.5, 0.5), smoothing_function=smoother.method1)
0.09128709291752769

# Canonical multi-bleu smoothing, aka method4().
>>> sentence_bleu([[1,2,3,4]],[5,6,8,1], smoothing_function=smoother.method4)
0.19564209772076444

Но ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ это Π² SmoothingFunction.method0 ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ method0() ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ ΡΠ³Π»Π°ΠΆΠΈΠ²Π°ΡŽΡ‚ BLEU.


Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ sys.float_info.min вмСсто отсрочки Ρ‚ΠΎΠΆΠ΅ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

Π€ΠΎΡ€ΠΌΡƒΠ»Π° BLEU:

Одна ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Π·Π»ΠΎΠΌ вСсов Π±Π΅Π· эмпиричСской истины - плохая идСя, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ вСса Π² BLEU ΠΏΠΎΠ΄Ρ‡ΠΈΠ½ΡΡŽΡ‚ΡΡ exp() .

Π˜Ρ‚Π°ΠΊ, Ссли ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ вычислСниям BLEU с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ ΠΎΠ΄Π½ΠΎΡ€ΠΎΠ΄Π½Ρ‹ΠΌΠΈ вСсами 0,25, ΠΎΡ†Π΅Π½ΠΊΠ° BLEU Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ Π½ΠΈΠ·ΠΊΠΎΠΉ - 0.

>>> p_n = [0.25, sys.float_info.min, sys.float_info.min, sys.float_info.min]
>>> weights = (0.25, 0.25, 0.25, 0.25)
>>> math.exp(sum(w*math.log(p_i) for w, p_i in zip(weights, p_n)))
1.288229753919562e-231

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ weights=(0.5, 0.5) , Ρ‚ΠΎΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² 0.

>>> p_n = [0.25, sys.float_info.min]
>>> weights = (0.5, 0.5)
>>> math.exp(sum(w*math.log(p_i) for w, p_i in zip(weights, p_n)))
7.458340731200295e-155

ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, это Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ отсрочки sys.float_info.min ВБЕГДА ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ свСрхнизкому Π±Π°Π»Π»Ρƒ BLEU.

Если ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ сСбС использованиС ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ идСального ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ встрСчный ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

>>> m1 = modified_precision([[1,2,3,4]], [2,3,4,5], 1)
>>> m2 = modified_precision([[1,2,3,4]], [2,3,4,5], 2)
>>> m3 = modified_precision([[1,2,3,4]], [2,3,4,5], 3)
>>> m4 = modified_precision([[1,2,3,4]], [2,3,4,5], 4)
>>> [m1, m2, m3, m4]
[Fraction(3, 4), Fraction(2, 3), Fraction(1, 2), Fraction(0, 1)]
>>> [m1, m2, m3, sys.float_info.min]
[Fraction(3, 4), Fraction(2, 3), Fraction(1, 2), 2.2250738585072014e-308]
>>> p_n = [m1, m2, m3, sys.float_info.min]
>>> weights = (0.25, 0.25, 0.25, 0.25)
>>> math.exp(sum(w*math.log(p_i) for w, p_i in zip(weights, p_n)))
8.636168555094496e-78

Основная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ я спросил ΠΎ Π½Π°Π±ΠΎΡ€Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚Π΅ Π²ΠΎΠ»Π½Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅.

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ попытаСмся Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ sys.float_info.min , это создаст Ρ†Π΅Π»ΡƒΡŽ Π²ΠΎΠ»Π½Ρƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π½Π΅ рассматривали Π²Π½Π΅ своСго Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ….

Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹, Ссли ΠΌΡ‹ Π²Π΅Ρ€Π½Π΅ΠΌ n-Π³Ρ€Π°ΠΌΠΌ отсрочки:

>>> p_n = [m1, m2, m3]
>>> weights = (0.25, 0.25, 0.25)
>>> math.exp(sum(w*math.log(p_i) for w, p_i in zip(weights, p_n)))
0.7071067811865475

Π’ любом случаС, ΠΏΡ€ΠΈ использовании прСдлоТСния BLEU Π½Π° Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ вольном ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅ ΠΈΠ»ΠΈ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… прСдлоТСниях всСгда Π³Π»Π°Π΄ΠΊΠΎ:

# Laplacian smoothing, with altered weights.
>>> sentence_bleu([[1,2,3,4]],[5,6,8,1], weights=(0.5, 0.5), smoothing_function=smoother.method1)
0.09128709291752769

# Canonical multi-bleu smoothing, aka method4().
>>> sentence_bleu([[1,2,3,4]],[5,6,8,1], smoothing_function=smoother.method4)
0.19564209772076444

@alvations Бпасибо Π·Π° ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² NLTK. ΠœΡ‹ Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ стСпСни использовали Π΅Π³ΠΎ, экспСримСнтируя с систСмами модСлирования Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² (ΠΈΠ»ΠΈ Ρ‡Π°Ρ‚-Π±ΠΎΡ‚Π°ΠΌΠΈ) Π² True AI .

Π― ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ Π²ΠΈΠΆΡƒ смысл ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΎ нСиспользовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сглаТивания, ΠΊΠΎΠ³Π΄Π° любая ΠΈΠ· n-Π³Ρ€Π°ΠΌΠΌΠΎΠ² оцСниваСтся ΠΊΠ°ΠΊ 0. ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сглаТивания, ΠΌΡ‹ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°Ρ‡Π°Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сглаТивания 1 ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Однако я всС ΠΆΠ΅ Π±Ρ‹Π» ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΈΠ²Π»Π΅Π½, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ с ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ сглаТивания Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° Π½Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»Π° Π½ΠΈΠΊΠ°ΠΊΠΈΡ… n-Π³Ρ€Π°ΠΌΠΌΠΎΠ² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ порядка. Π― ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π», глядя Π½Π° уравнСния Π² Chen et.

ОсновноС ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ для расчСта ΠΎΡ†Π΅Π½ΠΊΠΈ BLEU (Π±Π΅Π· сглаТивания), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹ размСстили Π²Ρ‹ΡˆΠ΅ (ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ 2 Π² Chen et al. ), И ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π² ΠΊΠΎΠ΄Π΅:
skarmavbild 2017-09-27 kl 14 39 00
Π³Π΄Π΅ p_m опрСдСляСтся ΠΊΠ°ΠΊ (ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ 3 Π² Chen et. al ):
skarmavbild 2017-09-27 kl 14 39 45
Однако Π²Ρ‹ вычисляСтС p_m ΠΊΠ°ΠΊ:
skarmavbild 2017-09-27 kl 14 40 10

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅, Ρ‡Π΅ΠΌ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ€Π΅ΠΊΠ»Π°ΠΌΠΈΡ€ΡƒΠ΅Ρ‚Π΅. Π’Ρ‹ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚Π΅ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ функция сглаТивания 0 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сглаТиваниС Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΈ Ρ‡Ρ‚ΠΎ Π² этом случаС Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ уравнСния для вычислСния BLEU. Π­Ρ‚ΠΎ просто Π½Π΅ΠΏΡ€Π°Π²Π΄Π°. Π’Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅, Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ для вычислСния p_m ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ упоминаСтся Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅.

Ага, Π²ΠΎΡ‚ ΠΈ ошибка ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ BLEU ΠΈ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ΠΌ (2) ΠΈΠ· ​​Chen and Cherry (2014).

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² исходном BLEU (1992) p_n Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΈΠ· дСсятичного пространства Π² логарифмичСскоС, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкС матСматичСской области, ΠΊΠΎΠ³Π΄Π° p_n = 0:

skarmavbild 2017-09-27 kl 14 39 00

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π² этом случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ «хитрости», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Ρ‚ΡŒ всС ΠΊΡ€Π°ΠΉΠ½ΠΈΠ΅ случаи. Π£ multi-bleu.perl Π±Ρ‹Π»Π° другая стратСгия, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Ρ‚ΡŒ это .

Но Π² Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠ΅ Π§Π΅Π½Π° ΠΈ Π§Π΅Ρ€Ρ€ΠΈ это ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ дСсятичных Π·Π½Π°ΠΊΠΎΠ² с ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ N, Ρ‚. Π•.

Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ошибок матСматичСских Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² Π±Π΅Π· пространства ΠΆΡƒΡ€Π½Π°Π»Π° ΠΈ exp. Но, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, это Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π½ΠΎΠ²ΠΎΠΉ Π²ΠΎΠ»Π½Π΅ ошибок, скорСС всСго, ΠΈΠ·-Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ, Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ Π½Π΅Ρ‚. Пока unittest для BLEU провСряСтся, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ рСализация этого Ρ‚ΠΎΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΎΡ‰Ρ€Π΅Π½ΠΈΠ΅ΠΌ; P


Π― ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽ, Ρ‡Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠΉΡ‚ΠΈ с исходной Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ log + exp, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΏΠΎΠΉΡ‚ΠΈ с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, которая слСдуСт Π±Π»ΠΈΠΆΠ΅ ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ multi-bleu.perl ΠΈ mteval-v13a.pl которая большС ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π° Π½Π° Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ сглаТивания, ΠΊΠΎΠ³Π΄Π° ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠ΅ числа мСньшС 4, Ρ‡Π΅Π³ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΈ машинном ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅.

РСшСниС ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ p_n Π±Ρ‹Π»ΠΎ чисто Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ошибки матСматичСской области. Но Ссли Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ прСдлоТСния ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ матСматичСской области ΠΈΠ· math.log(0) ΠΈ ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠΈ с log + exp, ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ для запросов Π½Π° вытягиваниС / ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ =)

Или ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ проголосуСт Π·Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ NLTK, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вмСсто этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΡƒ Chen and Cherry (2014)?

Но Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ я понимаю, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρƒ вас ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ большС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ использовании BLEU Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… систСмах, Π³Π΄Π΅ прСдлоТСния / сСгмСнты ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΌΠΈ.

ЀактичСски, послС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ SmoothingFunction я всСгда Ρ…ΠΎΡ‚Π΅Π», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±Ρ‹Π» установлСн сглаТСнный BLEU. Но ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ сглаТивания ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, поэтому ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π½Π΅Π³Π»Π°Π΄ΠΊΠΈΠΉ BLEU со странными ΠΎΡ‚ΠΊΠ°Ρ‚Π°ΠΌΠΈ ΠΈ прСдупрСТдСниями.


ΠšΡΡ‚Π°Ρ‚ΠΈ, для Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ использования я Π±Ρ‹ всСгда устанавливал сглаТиваниС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π° SmoothingFunction().method4 .

Π”Π²Π° уравнСния фактичСски ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ с матСматичСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния (ΠΊΡ€ΠΎΠΌΠ΅ w_n). Π Π°Π·Π½ΠΈΡ†Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ остороТным с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΎΡ†Π΅Π½ΠΊΠ΅ log (0). Π—Π΄Π΅ΡΡŒ log (0) Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ†Π΅Π½Π΅Π½ ΠΊΠ°ΠΊ -inf (ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅, Ссли -inf нСдоступСн Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈ). ΠžΡ†Π΅Π½ΠΊΠ° Π΅Π³ΠΎ Π΄ΠΎ 0 Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΡƒ, ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅. ΠžΡ†Π΅Π½ΠΊΠ° Π΅Π³ΠΎ Π΄ΠΎ 0 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π±ΠΎΠ»Π΅Π΅ высокий Π±Π°Π»Π» BLEU, Ссли Π½Π΅ Π±Ρ‹Π»ΠΎ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ n-Π³Ρ€Π°ΠΌΠΌΠΎΠ² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ порядка, Ρ‡Π΅ΠΌ Ссли Π±Ρ‹ Π±Ρ‹Π» Π½Π°ΠΉΠ΄Π΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ n-Π³Ρ€Π°ΠΌΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΡ‚ ΠΈΠ½Ρ‚ΡƒΠΈΡ†ΠΈΠΈ.

ΠžΡ†Π΅Π½ΠΊΠ° log (0) Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Ρ‹Π²Π°Π΅Ρ‚ простой. И с этим Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Π² ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ порядкС. math Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, бросая ValueError ΠΈ довСряя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. numpy с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -inf вмСстС с RuntimeWarning . Π•ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠ°ΠΊ Π·Π°, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΎΡ‚ΠΈΠ² использования -inf Π² качСствС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

Однако Π² этом ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ -inf.

Если ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° ΠΊΠΎΠ΄, Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ способ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это - ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ слСдуСт Π·Π° этим ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ else, Π½Π°:

p_n_new.append(sys.float_info.min)

ΠΈΠ»ΠΈ

return [sys.float_info.min]

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅.

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎ объСдинСно с elif _emulate_multibleu and i < 5: заявлСния ΠΈ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ else Π½Π° Π΄Π°Π½Π½ΠΎΠΌ этапС.

@bamattsson Π’ΠΎΡ‡Π½ΠΎ, это sys.float_info.min , вычислСниС срСднСго гСомСтричСского Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ.

Из ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π² ΠΌΠΎΠ΅ΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ , Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ sys.float_info.min ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΠΈΠ΄Π΅Π΅ΠΉ Π² зависимости ΠΎΡ‚ корпуса.

>>> m1 = modified_precision([[1,2,3,4]], [2,3,4,5], 1)
>>> m2 = modified_precision([[1,2,3,4]], [2,3,4,5], 2)
>>> m3 = modified_precision([[1,2,3,4]], [2,3,4,5], 3)
>>> m4 = modified_precision([[1,2,3,4]], [2,3,4,5], 4)
>>> [m1, m2, m3, m4]
[Fraction(3, 4), Fraction(2, 3), Fraction(1, 2), Fraction(0, 1)]
>>> [m1, m2, m3, sys.float_info.min]
[Fraction(3, 4), Fraction(2, 3), Fraction(1, 2), 2.2250738585072014e-308]
>>> p_n = [m1, m2, m3, sys.float_info.min]
>>> weights = (0.25, 0.25, 0.25, 0.25)
>>> math.exp(sum(w*math.log(p_i) for w, p_i in zip(weights, p_n)))
8.636168555094496e-78

Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ сбою unittest Π½Π° https://nltk.ci.cloudbees.com/job/pull_request_tests/430/TOXENV=py35-jenkins , jdk = jdk8latestOnlineInstall / testReport / junit / nltk.translate / bleu_score / offer_bleu / ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π΅Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Π½Π° β„– 1844.

Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠžΠ§Π•ΠΠ¬ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π½Π°Π΄ ΠΊΠ°ΠΊΠΈΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π­Ρ‚ΠΎ ΠΠ˜ΠšΠžΠ“Π”Π Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Π² корпусС BLEU, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ корпуса всСгда Π±Ρ‹Π»ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ Π³ΠΈΠΏΠΎΡ‚Π΅Π·Π°ΠΌΠΈ ΠΈ ΠΈΡ… ссылками Π΅ΡΡ‚ΡŒ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 1 4-Π³Ρ€Π°ΠΌΠΌΠΎΠ²Ρ‹Ρ… совпадСний.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ я ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Π°Ρ‚ΡŒ вашС исправлСниС ΠΊΠ°ΠΊ Ρ„Π»Π°Π³ / Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ / ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡŽ bleu. И Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, сдСлайтС Ρ„Π»Π°Π³ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ всС Ρ€Π°Π²Π½ΠΎ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ΅ отсрочки ngram, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π°. Π‘Ρ‹Π»ΠΎ принято ΠΌΠ½ΠΎΠ³ΠΎ сообраТСний, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ отсрочки ngram. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ β„–1330 Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ.

БобствСнно, Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ смотрим Π½Π° PR. Π’Π΅Ρ€Π½ΠΎ Π»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСстов с использованиСм ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠ³ΠΎ Π²Π°ΠΌΠΈ исправлСния Π΄Π°ΡŽΡ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈ emulate_multibleu=True ?

РСшСно Π² β„– 1844

Бпасибо @alvations , @bamattsson , @benleetownsend

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ