Form.h

형태 및 형태소에 관한 정보를 담는 구조체들이 선언된 헤더

Author

bab2min (bab2min@gmail.com)

Version

0.20.0

Date

2024-07-01

namespace kiwi

Functions

Form bake(const FormRaw &o, const Morpheme *morphBase, bool zCodaAppendable, bool zSiotAppendable, const Vector<uint32_t> &additionalCands = {})

변경가능한 형태 정보를 bake하여 최적화한다.

Parameters:
  • o – 변경 가능한 형태 정보

  • morphBase – 형태소 배열의 시작 위치

Returns:

최적화된 형태 정보

Morpheme bake(const MorphemeRaw &o, const Morpheme *morphBase, const Form *formBase, const Vector<size_t> &formMap)

변경 가능한 형태소 정보를 bake하여 최적화한다.

Parameters:
  • o – 변경 가능한 형태소 정보

  • morphBase – 형태소 배열의 시작 위치

  • formBase – 형태 배열의 시작 위치

  • formMap

Returns:

최적화된 형태소 정보

struct Form
#include <Form.h>

형태에 관한 모든 정보를 담는 구조체

Note

이 구조체는 변경 불가능한 상태로 사용된다. 인덱스는 모두 포인터로, std::vector는 FixedVector로 변경되어 수정이 불가능한 대신 각 값에 효율적으로 빠르게 접근 가능하다. kiwi::Kiwi 내 실제 형태소 분석 단계에 쓰인다.

Public Functions

Form()
~Form()
Form(const Form&)
Form(Form&&) noexcept
Form &operator=(const Form&)
Form &operator=(Form&&)
bool operator<(const Form &o) const
inline size_t sizeWithoutSpace() const

Public Members

KString form
FixedVector<const Morpheme*> candidate
uint32_t numSpaces = 0
CondVowel vowel = CondVowel::none
CondPolarity polar = CondPolarity::none
uint8_t formHash = 0
uint8_t zCodaAppendable
uint8_t zSiotAppendable
struct FormRaw
#include <Form.h>

형태에 관한 모든 정보를 담는 구조체의 템플릿

Note

변경가능한 상태로 인덱스와 관련된 값이나 std::vector 등의 길이를 변경할 수 있음. kiwi::KiwiBuilder에서 사용한다.

Public Functions

FormRaw()
~FormRaw()
FormRaw(const FormRaw&)
FormRaw(FormRaw&&) noexcept
FormRaw &operator=(const FormRaw&)
FormRaw &operator=(FormRaw&&)
FormRaw(const KString &_form)
bool operator<(const FormRaw &o) const
void serializerRead(std::istream &istr)
void serializerWrite(std::ostream &ostr) const

Public Members

KString form

형태

Vector<uint32_t> candidate

이 형태에 해당하는 형태소들의 목록

struct Morpheme
#include <Form.h>

형태소에 관한 모든 정보를 담는 구조체의 템플릿

Note

변경 불가능한 상태로 인덱스는 모두 포인터로, std::vector는 FixedVector로 변경되어 수정이 불가능한 대신 각 값에 효율적으로 빠르게 접근 가능하다. kiwi::Kiwi 내 실제 형태소 분석 단계에 쓰인다.

Public Functions

Morpheme()
~Morpheme()
Morpheme(const Morpheme&)
Morpheme(Morpheme&&) noexcept
Morpheme &operator=(const Morpheme&)
Morpheme &operator=(Morpheme&&)
std::ostream &print(std::ostream &os) const
inline const KString &getForm() const

형태소의 형태를 반환한다.

inline const Morpheme *getCombined() const

분할된 형태소의 경우 원형 형태소를 반환한다. 그 외에는 자기 자신을 반환한다.

Public Members

const KString *kform = nullptr
POSTag tag = POSTag::unknown
CondVowel vowel
CondPolarity polar
bool complex
bool saisiot
uint8_t senseId = 0
uint8_t combineSocket = 0
int32_t combined = 0
FixedPairVector<const Morpheme*, std::pair<uint8_t, uint8_t>> chunks
float userScore = 0
uint32_t lmMorphemeId = 0
uint32_t origMorphemeId = 0
struct MorphemeRaw
#include <Form.h>

형태소에 관한 모든 정보를 담는 구조체의 템플릿

Note

변경가능한 상태로 인덱스와 관련된 값이나 std::vector 등의 길이를 변경할 수 있음. kiwi::KiwiBuilder에서 사용한다.

Public Functions

MorphemeRaw()
~MorphemeRaw()
MorphemeRaw(const MorphemeRaw&)
MorphemeRaw(MorphemeRaw&&) noexcept
MorphemeRaw &operator=(const MorphemeRaw&)
MorphemeRaw &operator=(MorphemeRaw&&)
MorphemeRaw(POSTag _tag, CondVowel _vowel = CondVowel::none, CondPolarity _polar = CondPolarity::none, bool _complex = false, uint8_t _combineSocket = 0)

선행형태소의 자/모음 조건

inline CondVowel vowel() const

선행형태소의 모음조화 조건

inline CondPolarity polar() const

추가 분석이 가능한 형태소인지(파생어나 사이시옷이 포함된 합성명사 등)

inline bool complex() const
inline void setVowel(CondVowel v)
inline void setPolar(CondPolarity v)
inline void setComplex(bool v)
void serializerRead(std::istream &istr)
void serializerWrite(std::ostream &ostr) const

Public Members

uint32_t kform = 0

형태에 대한 포인터

POSTag tag = POSTag::unknown

품사 태그

uint8_t vpPack = 0

CondVowel, CondPolarity, complex를 각각 4, 3, 1비트로 묶어서 합친 값

uint8_t senseId = 0

의미 번호

uint8_t combineSocket = 0

형태소가 두 부분으로 분할된 경우 결합 번호를 표기하기 위해 사용된다.

Note

덥/VA, 춥/VA 등의 형태소는 어/EC와 만나면 더워, 추워와 같이 형태가 변화한다. 이 경우를 각각 처리하기 보다는 더/V + ㅂ/V, 추/V + ㅂ/V과 같이 분해하면 ㅂ/V + 어/EC로 변한다는 규칙만으로 처리가 가능해진다. (이 규칙은 chunks를 이용해 형태소 정보에 담길 수 있음) 그러나 모든 ㅂ으로 끝나는 형태소가 위와 같은 규칙에 결합되면 안된다. 예를 들어 굽/VA의 경우 어/EC와 만나도 굽어라고 형태가 유지되기 때문. 따라서 ㅂ/V이 결합할 수 있는 조건을 명시해서 이 조건과 맞는 경우에만 더/V + ㅂ/V -> 덥/VA과 같이 복원해야 한다. combineSocket이 0이면 이런 결합 조건이 없는 일반 형태소임을 뜻하며, 0이 아닌 경우 결합 조건을 가지고 분해된 형태소임을 뜻한다. 더/V워/UNK(ㅂ/V + 어/EC)는 예를 들어 3과 같이 동일한 combineSocket을 할당해 둘이 서로 결합이 가능한 형태소임을 식별한다.

Vector<uint32_t> chunks

여러 형태소가 결합되어 형태가 변경된 경우, 원 형태소 목록을 표기하기 위해 사용된다.

Note

되/VV + 어/EC의 결합은 라는 형태로 축약될 수 있다. 분석과정에서 를 만난 경우 역으로 되/VV + 어/EC로 분석할 수 있도록 돼/UNK를 더미 형태소로 등록하고 chunks에는 되/VV어/EC에 대한 포인터를 넣어둔다.

Vector<std::pair<uint8_t, uint8_t>> chunkPositions

여러 형태소가 결합되어 형태가 변경된 경우, 원 형태소의 위치 정보를 표기하기 위해 사용된다.

Note

pair.first는 시작 지점, pair.second는 끝 지점을 나타낸다. chunkPositions.size()는 항상 chunks.size()와 같다.

int32_t combined = 0

분할된 형태소의 원형 형태소를 가리키는 오프셋

See also

combineSocket

Note

덥/VA더/V + ㅂ/V으로 분할된 경우 더/V덥/VA에 대한 오프셋을 combined에 저장해둔다. kiwi::Morpheme::getCombined()를 통해 원형 형태소의 포인터를 구할 수 있음

float userScore = 0
uint32_t lmMorphemeId = 0

형태소의 언어모델 상의 인덱스 값을 보관하는 필드.

Note

대부분의 경우는 형태소 자체의 인덱스 값과 동일하지만, 이형태 형태소의 경우 원형 형태소의 인덱스 값을 가진다.

uint32_t origMorphemeId = 0
uint32_t groupId = 0

형태소의 그룹 인덱스.

Note

형태소 결합 시 음운 조건에 따라 이형태를 선택해야 하는 경우 그룹 인덱스가 동일한 형태소만 선택된다.

struct TypoForm

Public Functions

TypoForm() = default
inline TypoForm(const std::tuple<uint32_t, float, uint16_t, CondVowel> &p)
inline TypoForm(uint32_t _formId, float _score = 0, bool _hash = 0, uint32_t _typoId = 0, uint16_t _numSpaces = 0, CondVowel _leftCond = CondVowel::none)
inline const Form &form(const Form *data) const
inline float score() const
inline bool hash() const

Public Members

uint32_t formId = 0
float scoreHash = 0
uint32_t typoId = 0
uint16_t numSpaces = 0
CondVowel leftCond = CondVowel::none