nlp

package
v1.2.17 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 5, 2026 License: MIT Imports: 2 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Sentence

type Sentence struct {
	Text  string // 文のテキスト、または文と文の間の空白・改行
	Start int    // 原文(string)におけるバイトインデックスの開始位置
}

Sentence は切り出された文(または空白の塊)とその開始位置を保持する構造体です。

type SentenceSplitter

type SentenceSplitter struct {
	Mode               SplitMode
	MaxRunesInBracket  int // 閉じ括弧忘れに対するセーフティネット
	MaxRunesInSentence int // 0以下の数値を指定した場合、長さによる強制文切りは行われません。
}

func (*SentenceSplitter) SplitSentences

func (ss *SentenceSplitter) SplitSentences(text string) []Sentence

SplitSentences 日本語と英語(欧米語)が混在したテキストを、言語ごとの文脈や記号の特性、特殊な表現を考慮しながら適切な「文(Sentence)」に分割する。 ## 基本設計思想

  • **完全な復元性(100% Round-trip)** 原文の文字(スペース、タブ、改行を含む)を1ビットも破棄・改変しません。文と文の間に存在する空白文字も位置情報を保持したまま独立した要素として回収するため、分割された全要素のテキストを単純結合( `res[0].Text + res[1].Text + ...` )するだけで、**原文と100%完全一致する文字列を再構築可能**です。
  • **位置情報(Byte Index)の提供** 分割された各要素には、UTF-8エンコードにおける原文からの開始バイトインデックス( `Start` )が付与されます。これにより、下流のタスクでのハイライト表示やアノテーションへのマッピングが容易になります。

## 文末判定ロジック ### 基本文末記号 スタックが空(括弧の外側)である場合において、以下の文字を基本文末として認識します。

全角/半角記号: 。、!、?、!、?
ピリオド: . (ただし、後述の「例外判定」を通過したもののみ)

### 文末記号・閉じ括弧の連続巻き込み(コンボ処理) 文末記号が検出された際、その直後に連続する「他の文末記号」や「閉じ括弧」は、すべて現在の文の一部として末尾に巻き込んで切り出します。

例: Really?! → ? で文切りせず、後ろの ! まで含めて Really?! を1文とする。
例: お祝いです!)」 → !」 までを1つの文の末尾として扱う。

### 改行コードの動作(NewlineModeによる制御) 引数で指定されたモードにより、改行コード( \n、\r、\r\n )の扱いが以下のように切り替わります。 モード名 識別子 振る舞いの詳細 強制 SplitForceByEOL 改行コードを検出した時点で、文末記号の有無に関わらず強制的に文を区切る。 無視 SplitIgnoreEOL 改行コードを単なる空白文字(スペースと同等)として扱い、強制文切りを行わない。 連続なら改行 SplitOnBlankLine 改行の直後に「文字(非空白文字)」が続く場合は結合。途中に空白行(改行やスペースのみの行)を挟む場合のみ文を区切る(Windowsの \r\n も1つの改行として適切に跨ぎます)。

## 誤分割防止(例外処理・エスケープ) ### 括弧(クォーテーション)のネスト管理 括弧の内部にある文末記号(例: 「〜。〜」 や "(~.~)")による誤分割を防ぐため、スタックによる状態管理を行います。スタックが空(括弧の外側)の場合のみ文切りが実行されます。

左右が明確な括弧(ペア管理):
「」、『』、()、()、[]、{}、〈〉、《》、〔〕、【】、“”、‘’

半角ダブルクォーテーション( " )のトグル処理:
左右の区別がない半角 " は、スタックの末尾を確認し、すでに " があれば「閉じる」、なければ「開く」というトグル制御で内部判定を行います(これにより引用符内のピリオド等での誤分割を防ぎます)。

アポストロフィ( ' )の除外:
英語の縮約形( I'm や don't など)での誤判定を防ぐため、半角のシングルクォーテーション(アポストロフィ)はスタック管理の対象外(常に無視)とします。

セーフティネット(閉じ忘れ対策):
閉じ括弧の書き忘れによるスタック崩壊(以降すべての文切りがスキップされる現象)を防ぐため、1つの文の文字数が 400文字 を超えた場合は強制的にスタックをクリアします。

### ピリオド( . )に特化した例外判定 英語圏のテキストにおける以下のケースでは、ピリオドが検出されても文末とはみなされません。

小数点: 前後が半角数字で挟まれている場合(例: 3.14 )。
主要な省略語: 直前の単語が定義された省略語リスト( Mr, Ms, Dr, Inc, Ltd, Co, Corp, e.g, i.e, vs など)に一致する場合。
URL / ドメイン: ピリオド(および後ろに続く閉じ括弧・文末記号)の直後に、スペースや改行を挟まらずすぐ次の文字が始まっている場合(例: google.com )。

## 特殊なケースにおける挙動

先頭/末尾の空白:
テキストの最先頭、および最後尾にある空白や改行の塊も、それぞれ独立した空白要素として安全に切り出され、位置情報が保持されます。

文直後のスペース:
文が確定した直後に連続するスペースやタブは、文そのものには含めず、次の要素(空白要素)として分離します。これにより、文のテキストから余分なトリム処理を行う必要がなくなります。

## `maxLen` に 0 以下の数値を指定した場合、長さによる強制文切りは行われません。

type SplitMode

type SplitMode int

SplitMode は改行コードの扱いを指定する動作モード

const (
	SplitForceByEOL  SplitMode = iota // 改行コードで強制文切り
	SplitIgnoreEOL                    // 改行無視(スペース扱い)
	SplitOnBlankLine                  // 空白行を挟む場合のみ文切り
)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL