Wolfram Language Paclet Repository

Community-contributed installable additions to the Wolfram Language

Primary Navigation

    • Cloud & Deployment
    • Core Language & Structure
    • Data Manipulation & Analysis
    • Engineering Data & Computation
    • External Interfaces & Connections
    • Financial Data & Computation
    • Geographic Data & Computation
    • Geometry
    • Graphs & Networks
    • Higher Mathematical Computation
    • Images
    • Knowledge Representation & Natural Language
    • Machine Learning
    • Notebook Documents & Presentation
    • Scientific and Medical Data & Computation
    • Social, Cultural & Linguistic Data
    • Strings & Text
    • Symbolic & Numeric Computation
    • System Operation & Setup
    • Time-Related Computation
    • User Interface Construction
    • Visualization & Graphics
    • Random Paclet
    • Alphabetical List
  • Using Paclets
    • Get Started
    • Download Definition Notebook
  • Learn More about Wolfram Language

FunctionalParsers

Guides

  • Functional parsers

Tech Notes

  • Интерпретатори на желания за храни
  • Food cravings grammar and interpreters
  • Парсване на имена на цели числа
  • Integer names parsing

Symbols

  • AddParserModifier
  • EBNFAlternativesInterpreter
  • EBNFAlternatives
  • EBNFContextRules
  • EBNF
  • EBNFNonTerminalInterpreter
  • EBNFNonTerminal
  • EBNFOptionInterpreter
  • EBNFOption
  • EBNFRepetitionInterpreter
  • EBNFRepetition
  • EBNFRuleInterpreter
  • EBNFRule
  • EBNFSequenceInterpreter
  • EBNFSequence
  • EBNFTerminalInterpreter
  • EBNFTerminal
  • GenerateParsersFromEBNF
  • GrammarNormalize
  • GrammarRandomSentences
  • InterpretWithContext
  • ParseAlternativeComposition
  • ParseApply
  • ParseBracketed
  • ParseChain1Left
  • ParseChainLeft
  • ParseChainRight
  • ParseChoice
  • ParseComposeWithResults
  • ParseCurlyBracketed
  • ParseEBNF
  • ParseEpsilon
  • ParseFail
  • ParseFuzzySymbol
  • ParseJust
  • ParseListOf
  • ParseMany1
  • ParseManyByBranching
  • ParseMany
  • ParseModify
  • ParseOption1
  • ParseOption
  • ParsePack
  • ParseParenthesized
  • ParsePredicate
  • ParseRecursiveDefinition
  • ParseSequentialComposition
  • ParseSequentialCompositionPickLeft
  • ParseSequentialCompositionPickRight
  • ParseShortest
  • ParseSome
  • ParseSpaces
  • ParseSucceed
  • ParseSymbol
  • ParseToEBNFTokens
  • ParseToken
  • ParseToTokens
  • ParsingTestTable
  • SetParserModifier
  • ToTokens
Парсване на имена на цели числа
Въведение
Тестване
Генериране на имена на цели числа
Тестове за ефективност
Генериране на граматични правила
Препратки
Случайни изречения
​
Въведение
В тази тетрадка описваме как да създадем парсери-интерпретатори, които анализират целочислени имена и ги интерпретират до съответните целочислени стойности.
Ето примери, в които се използват вградените функции на Mathematica:
In[12]:=
IntegerName[12321,"Words"]
Out[12]=
twelve thousand, three hundred twenty-one
In[13]:=
SemanticInterpretation["twelve thousand, three hundred twenty-one"]
Out[13]=
12321
Имаме две главни цели:
1
.
За да покажем как може да се реализира този вид функционалност.
2
.
Реализиране на по-бърз парсер-интерпретатор от вградената функция SemanticInterpretation.
За да постигнем тези цели, ние автоматично генерираме граматични правила в Разширената Бакус-Наур Форма (РБНФ) (англ.
Еxtended Backus-Naur Form
или "EBNF"), [Wk1], и след това генерираме съответните парсери, използвайки функциите на пакета
AntonAntonov/FunctionalParsers
, (също вижте [AAp1]).
Забележка: Пакетът [AAp1] и пакетирането [AAp2] следват до голяма степен изложението в [JF1]. Пакетът [AAp3] предоставя "продуцирана" версия на кода на граматиката и парсерите в тази тетрадка.
Зареди пакета
In[14]:=
Needs["AntonAntonov`FunctionalParsers`"]
Генериране на имена на цели числа
Имената на зададени цели числа могат да се генерират лесно (и бързо) с помощта на вградената функция
IntegerName
. Ето няколко примера:
In[15]:=
IntegerName[1234567,"Bulgarian"]
Out[15]=
един милион двеста тридесет и четири хиляди петстотин шестдесет и седем
In[16]:=
IntegerName[9342,"Bulgarian"]
Out[16]=
девет хиляди триста четиридесет и две
Тук генерираме имената на "основните" цели числа от 0 до 10:
In[17]:=
IntegerName[#,"Bulgarian"]&/@Range[0,10]
Out[17]=
нула,едно,две,три,четири,пет,шест,седем,осем,девет,десет
Тук генерираме имена на "основни" цели числа от 11 до 19:
In[18]:=
IntegerName[#,"Bulgarian"]&/@Range[11,19]
Out[18]=
единадесет,дванадесет,тринадесет,четиринадесет,петнадесет,шестнадесет,седемнадесет,осемнадесет,деветнадесет
Тук генерираме имена на "основни" кратни на 10:
In[19]:=
IntegerName[#,"Bulgarian"]&/@Range[20,90,10]
Out[19]=
двадесет,тридесет,четиридесет,петдесет,шестдесет,седемдесет,осемдесет,деветдесет
Генериране на граматични правила
В този раздел генерираме правилата на граматиката задедена с РБНФ. Използваме вградената функция
IntegerName
.

The basic rules

Ето правилата на РБНФ за разбор на "основните" имена на цели числа:
In[20]:=
nRules=Table["<"<>"name-of-"<>ToString[i]<>"> = '"<>StringReplace[IntegerName[i,"Bulgarian"],{"1 ""","one """}]<>"' <@ Function["<>ToString[i]<>"] ;",{i,Join[Range[0,19],Range[20,100,10],Range[200,1000,100],{1000,10^6}]}]
Out[20]=
<name-of-0> = 'нула' <@ Function[0] ;,<name-of-1> = 'едно' <@ Function[1] ;,<name-of-2> = 'две' <@ Function[2] ;,<name-of-3> = 'три' <@ Function[3] ;,<name-of-4> = 'четири' <@ Function[4] ;,<name-of-5> = 'пет' <@ Function[5] ;,<name-of-6> = 'шест' <@ Function[6] ;,<name-of-7> = 'седем' <@ Function[7] ;,<name-of-8> = 'осем' <@ Function[8] ;,<name-of-9> = 'девет' <@ Function[9] ;,<name-of-10> = 'десет' <@ Function[10] ;,<name-of-11> = 'единадесет' <@ Function[11] ;,<name-of-12> = 'дванадесет' <@ Function[12] ;,<name-of-13> = 'тринадесет' <@ Function[13] ;,<name-of-14> = 'четиринадесет' <@ Function[14] ;,<name-of-15> = 'петнадесет' <@ Function[15] ;,<name-of-16> = 'шестнадесет' <@ Function[16] ;,<name-of-17> = 'седемнадесет' <@ Function[17] ;,<name-of-18> = 'осемнадесет' <@ Function[18] ;,<name-of-19> = 'деветнадесет' <@ Function[19] ;,<name-of-20> = 'двадесет' <@ Function[20] ;,<name-of-30> = 'тридесет' <@ Function[30] ;,<name-of-40> = 'четиридесет' <@ Function[40] ;,<name-of-50> = 'петдесет' <@ Function[50] ;,<name-of-60> = 'шестдесет' <@ Function[60] ;,<name-of-70> = 'седемдесет' <@ Function[70] ;,<name-of-80> = 'осемдесет' <@ Function[80] ;,<name-of-90> = 'деветдесет' <@ Function[90] ;,<name-of-100> = 'сто' <@ Function[100] ;,<name-of-200> = 'двеста' <@ Function[200] ;,<name-of-300> = 'триста' <@ Function[300] ;,<name-of-400> = 'четиристотин' <@ Function[400] ;,<name-of-500> = 'петстотин' <@ Function[500] ;,<name-of-600> = 'шестстотин' <@ Function[600] ;,<name-of-700> = 'седемстотин' <@ Function[700] ;,<name-of-800> = 'осемстотин' <@ Function[800] ;,<name-of-900> = 'деветстотин' <@ Function[900] ;,<name-of-1000> = 'хиляда' <@ Function[1000] ;,<name-of-1000> = 'хиляда' <@ Function[1000] ;,<name-of-1000000> = 'един милион' <@ Function[1000000] ;
Тук вземаме лявата страна (англ. "Left Hand Side" или "LHS") на всяко правило:
In[21]:=
nRulesLHS=Table["<"<>"name-of-"<>ToString[i]<>">",{i,Join[Range[0,19],Range[20,100,10],Range[200,1000,100],{1000,10^6}]}]
Out[21]=
{<name-of-0>,<name-of-1>,<name-of-2>,<name-of-3>,<name-of-4>,<name-of-5>,<name-of-6>,<name-of-7>,<name-of-8>,<name-of-9>,<name-of-10>,<name-of-11>,<name-of-12>,<name-of-13>,<name-of-14>,<name-of-15>,<name-of-16>,<name-of-17>,<name-of-18>,<name-of-19>,<name-of-20>,<name-of-30>,<name-of-40>,<name-of-50>,<name-of-60>,<name-of-70>,<name-of-80>,<name-of-90>,<name-of-100>,<name-of-200>,<name-of-300>,<name-of-400>,<name-of-500>,<name-of-600>,<name-of-700>,<name-of-800>,<name-of-900>,<name-of-1000>,<name-of-1000>,<name-of-1000000>}
Тук обединяваме всички основни правила за цели числа:
In[22]:=
numberNameRules=StringRiffle[nRules,"\n"];​​Magnify[numberNameRules,0.8]
Out[23]=
<name-of-0> = 'нула' <@ Function[0] ;<name-of-1> = 'едно' <@ Function[1] ;<name-of-2> = 'две' <@ Function[2] ;<name-of-3> = 'три' <@ Function[3] ;<name-of-4> = 'четири' <@ Function[4] ;<name-of-5> = 'пет' <@ Function[5] ;<name-of-6> = 'шест' <@ Function[6] ;<name-of-7> = 'седем' <@ Function[7] ;<name-of-8> = 'осем' <@ Function[8] ;<name-of-9> = 'девет' <@ Function[9] ;<name-of-10> = 'десет' <@ Function[10] ;<name-of-11> = 'единадесет' <@ Function[11] ;<name-of-12> = 'дванадесет' <@ Function[12] ;<name-of-13> = 'тринадесет' <@ Function[13] ;<name-of-14> = 'четиринадесет' <@ Function[14] ;<name-of-15> = 'петнадесет' <@ Function[15] ;<name-of-16> = 'шестнадесет' <@ Function[16] ;<name-of-17> = 'седемнадесет' <@ Function[17] ;<name-of-18> = 'осемнадесет' <@ Function[18] ;<name-of-19> = 'деветнадесет' <@ Function[19] ;<name-of-20> = 'двадесет' <@ Function[20] ;<name-of-30> = 'тридесет' <@ Function[30] ;<name-of-40> = 'четиридесет' <@ Function[40] ;<name-of-50> = 'петдесет' <@ Function[50] ;<name-of-60> = 'шестдесет' <@ Function[60] ;<name-of-70> = 'седемдесет' <@ Function[70] ;<name-of-80> = 'осемдесет' <@ Function[80] ;<name-of-90> = 'деветдесет' <@ Function[90] ;<name-of-100> = 'сто' <@ Function[100] ;<name-of-200> = 'двеста' <@ Function[200] ;<name-of-300> = 'триста' <@ Function[300] ;<name-of-400> = 'четиристотин' <@ Function[400] ;<name-of-500> = 'петстотин' <@ Function[500] ;<name-of-600> = 'шестстотин' <@ Function[600] ;<name-of-700> = 'седемстотин' <@ Function[700] ;<name-of-800> = 'осемстотин' <@ Function[800] ;<name-of-900> = 'деветстотин' <@ Function[900] ;<name-of-1000> = 'хиляда' <@ Function[1000] ;<name-of-1000> = 'хиляда' <@ Function[1000] ;<name-of-1000000> = 'един милион' <@ Function[1000000] ;
Тук използваме правилата за цели числа от 1 до 19:
In[24]:=
numberName1To19Rule="<name-1-to-19> = "<>StringRiffle[Take[nRulesLHS,{2,20}]," | "]<>" ;"
Out[24]=
<name-1-to-19> = <name-of-1> | <name-of-2> | <name-of-3> | <name-of-4> | <name-of-5> | <name-of-6> | <name-of-7> | <name-of-8> | <name-of-9> | <name-of-10> | <name-of-11> | <name-of-12> | <name-of-13> | <name-of-14> | <name-of-15> | <name-of-16> | <name-of-17> | <name-of-18> | <name-of-19> ;
Тук създаваме съставно правило за целите числа от 0 до 19:
Тук правим съставно правило за "основните" множители от 10:
Тук правим съставно правило за "основните" цели числа от 1 до 10:
Тук правим съставно правило за "основните" цели числа кратни на 100:
Тук се дефинират функциите на интерпретатора, които ще се използват с парсерите:

Пълната граматика

Това е "макро"-частта на граматиката за "именувани цели числа" в РБНФ:
Комбиниране на всички правила:
Необходимо е да се направят следните малки промени с цел парсването на различни желателни и допустими варианти на начално генерираните думи:
Ето пъланата граматиката за "именувани цели числа" в РБНФ:

Генериране на парсeри

Тук генерираме парсeрите с помощта на пакета [AAp2]:

Първи примери за парсване

Тук виждаме, че парсерът работи:
Случайни изречения
Деобре е се видят случайно генерирани изречения с граматиката на именуваните цели числа. Очакваме всички случайни изречения да бъдат смислени имена на цели числа.
Тестване
В този раздел показваме извеждането на тестове и проверката на граматиката (и генерираните парсери).
Функция за токенизиране
Създаване на списък със случайни цели числа
Създаване на асоциация с целите числа като ключове и техните именувани форми като стойности
Направете таблица с резултатите от парсинга
Създаване на асоциация с резултатите от парсинга:
Тук проверяваме дали получаваме очакваните резултати
Преброяването на логическите резултати
Тестове за ефективност
В този раздел демонстрираме, че полученият парсер-интерпретатор е по-бърз от вградените.
Ето броя на заявките:
Това е времето за работа със специалните парсери:
Ето как изглеждат резултатите:
Ето как изглеждат резултатите:
Забележка: Можем да видим, че специалният парсер осигурява 100 пъти по-бързи резултати.
Препратки

Статии

[JF1] Jeroen Fokker, Functional parsers. (1997), Advanced Functional Programming: First International Spring School on Advanced Functional Programming Techniques Båstad, Sweden, May 24–30, 1995 Tutorial Text. DOI: 10.1007/3-540-59451-5_1.

Пакети

© 2025 Wolfram. All rights reserved.

  • Legal & Privacy Policy
  • Contact Us
  • WolframAlpha.com
  • WolframCloud.com