コンテンツにスキップ

テキスト処理

正規表現、テキスト差分、セマンティックテキスト分割を提供します。

local text = require("text")
local re, err = text.regexp.compile("[0-9]+")
パラメータ説明
patternstringRE2互換の正規表現パターン

戻り値: Regexp, error

local ok = re:match_string("abc123")
パラメータ説明
sstringマッチする文字列

戻り値: boolean

local match = re:find_string("abc123def")
パラメータ説明
sstring検索する文字列

戻り値: string | nil

local matches = re:find_all_string("a1b2c3")
パラメータ説明
sstring検索する文字列

戻り値: string[]

local match = re:find_string_submatch("user@example.com")
パラメータ説明
sstring検索する文字列

戻り値: string[] | nil(完全マッチ + キャプチャグループ)

local matches = re:find_all_string_submatch("a=1 b=2")
パラメータ説明
sstring検索する文字列

戻り値: string[][]

local pos = re:find_string_index("abc123")
パラメータ説明
sstring検索する文字列

戻り値: table | nil({start, end}、1ベース)

local positions = re:find_all_string_index("a1b2c3")
パラメータ説明
sstring検索する文字列

戻り値: table[] | nil(一致がない場合は nil)

local result = re:replace_all_string("a1b2", "X")
パラメータ説明
sstring入力文字列
replstring置換文字列

戻り値: string

local parts = re:split("a,b,c", -1)
パラメータ説明
sstring分割する文字列
ninteger最大パート数、-1で全て

戻り値: string[]

local count = re:num_subexp()

戻り値: number

local names = re:subexp_names()

戻り値: string[]

local pattern = re:string()

戻り値: string

テキストバージョンを比較してパッチを生成。go-diff(Googleのdiff-match-patch)ベース。

local diff, err = text.diff.new()
local diff, err = text.diff.new(options)

戻り値: Differ, error

フィールドデフォルト説明
diff_timeoutnumber1.0タイムアウト(秒)
diff_edit_costinteger4空編集のコスト
match_thresholdnumber0.5マッチ許容度 0-1
match_distanceinteger1000マッチを検索する距離
patch_delete_thresholdnumber0.5削除閾値
patch_margininteger4コンテキストマージン

2つのテキスト間の差分を検出します。text1をtext2に変換する操作を記述した配列を返します。

local diff, _ = text.diff.new()
local diffs, err = diff:compare("hello world", "hello there")
-- diffsの内容:
-- {operation = "equal", text = "hello "}
-- {operation = "delete", text = "world"}
-- {operation = "insert", text = "there"}
パラメータ説明
text1string元のテキスト
text2string変更後のテキスト

戻り値: table, error({operation, text}の配列)

操作: "equal""delete""insert"

バージョン間で変更された文字数をカウントします。

local diffs, _ = diff:compare("hello world", "hello there")
local summary = diff:summarize(diffs)
-- summary.equals = 6(変更なしの文字数)
-- summary.deletions = 5(削除された文字数)
-- summary.insertions = 5(追加された文字数)
パラメータ説明
diffstablecompareからの差分配列

戻り値: table({insertions, deletions, equals})

ターミナル表示用にANSIカラーで差分をフォーマットします。

local formatted, err = diff:pretty_text(diffs)
print(formatted)
パラメータ説明
diffstablecompareからの差分配列

戻り値: string, error

<del><ins>タグでHTMLとして差分をフォーマットします。

local html, err = diff:pretty_html(diffs)
-- 戻り値: "hello <del>world</del><ins>there</ins>"
パラメータ説明
diffstablecompareからの差分配列

戻り値: string, error

テキストを別のテキストに変換するためのパッチを生成します。パッチはシリアライズして後で適用できます。

local text1 = "The quick brown fox jumps over the lazy dog"
local text2 = "The quick red fox jumps over the lazy cat"
local patches, err = diff:patch_make(text1, text2)
パラメータ説明
text1string元のテキスト
text2string変更後のテキスト

戻り値: table, error

テキストを変換するためにパッチを適用します。結果とすべてのパッチが正常に適用されたかどうかを返します。

local result, success = diff:patch_apply(patches, text1)
-- result = "The quick red fox jumps over the lazy cat"
-- success = true
パラメータ説明
patchestablepatch_makeからのパッチ
textstringパッチを適用するテキスト

戻り値: string, boolean

セマンティック境界を保持しながら大きなドキュメントを小さなチャンクに分割します。langchaingoテキストスプリッターベースです。

セパレータの階層を使用してテキストを分割します。まず二重改行(段落)で分割を試み、次に単一改行、次にスペース、次に文字で分割します。チャンクがサイズ制限を超えると、より小さなセパレータにフォールバックします。

local splitter, err = text.splitter.recursive({
chunk_size = 1000,
chunk_overlap = 100
})
local long_text = "This is a long text that needs splitting..."
local chunks, err = splitter:split_text(long_text)
-- chunks = {"This is a long...", "...text that needs...", "...splitting..."}

戻り値: Splitter, error

オプション {id=“recursive-splitter-options”}

Section titled “オプション {id=“recursive-splitter-options”}”
フィールドデフォルト説明
chunk_sizeinteger4000チャンクあたりの最大文字数
chunk_overlapinteger200隣接チャンク間で繰り返される文字数
keep_separatorbooleanfalse出力にセパレータを保持
separatorsstring[]nilカスタムセパレータリスト

構造を尊重しながらmarkdownドキュメントを分割します。見出しとそのコンテンツをまとめ、コードブロックを維持し、テーブル行をまとめます。

local splitter, err = text.splitter.markdown({
chunk_size = 2000,
code_blocks = true,
heading_hierarchy = true
})
local readme = fs.read("README.md")
local chunks, err = splitter:split_text(readme)

戻り値: Splitter, error

オプション {id=“markdown-splitter-options”}

Section titled “オプション {id=“markdown-splitter-options”}”
フィールドデフォルト説明
chunk_sizeinteger4000チャンクあたりの最大文字数
chunk_overlapinteger200隣接チャンク間で繰り返される文字数
code_blocksbooleanfalseコードブロックをまとめて保持
reference_linksbooleanfalse参照リンクを保持
heading_hierarchybooleanfalse見出しレベルを尊重
join_table_rowsbooleanfalseテーブル行をまとめて保持

単一のドキュメントをチャンクの配列に分割します。

local chunks, err = splitter:split_text(document)
for i, chunk in ipairs(chunks) do
-- 各チャンクを処理(例: エンベディング作成、LLMへ送信)
process(chunk)
end
パラメータ説明
textstring分割するテキスト

戻り値: string[], error

メタデータを保持しながら複数のドキュメントを分割します。各入力ドキュメントは複数の出力チャンクを生成できます。すべてのチャンクはソースドキュメントからメタデータを継承します。

-- 入力: ページ番号付きのPDFページ
local pages = {
{content = "First page content...", metadata = {page = 1}},
{content = "Second page content...", metadata = {page = 2}}
}
local chunks, err = splitter:split_batch(pages)
-- 出力: 各チャンクはどのページから来たか認識
for _, chunk in ipairs(chunks) do
print("Page " .. chunk.metadata.page .. ": " .. chunk.content:sub(1, 50))
end
パラメータ説明
pagestable{content, metadata}の配列

戻り値: table, error({content, metadata}の配列)

条件種別再試行可能
無効なパターン構文errors.INVALIDno
内部エラーerrors.INTERNALno

エラーの処理についてはエラー処理を参照。