このモジュールは、ノードセグメントマジックの変更に基づいており、電子とブラウザーのサポートを追加し、電子マルチスレッドランニング環境に最適化する準備ができています。
変更するために時間を費やす必要がある理由は、 segmentとnodejiebaノード環境では非常に役立ちますが、ブラウザと電子環境ではまったく実行できないからです。コードをES2015にリファクタリングし、babelプラグインを辞書ファイルに巻き込みました。ロードされている場合、サイズは3.8mです。ただし、辞書が必要ない場合は、辞書とモジュールがツリーの振動をサポートします(ESMモジュールを使用してください)。
< script src =" https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/segmentit.min.js " /> npm i segmentit import { Segment , useDefault } from 'segmentit' ;
const segmentit = useDefault ( new Segment ( ) ) ;
const result = segmentit . doSegment ( '工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作。' ) ;
console . log ( result ) ;Runkit環境の場合:
const { Segment , useDefault } = require ( 'segmentit' ) ;
const segmentit = useDefault ( new Segment ( ) ) ;
const result = segmentit . doSegment ( '工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作。' ) ;
console . log ( result ) ;Runkitでの無料トライアル
ダイレクトブラウザの使用の例:
まず、「https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/segmentit.js」を引用してください。
const segmentit = Segmentit . useDefault ( new Segmentit . Segment ( ) ) ;
const result = segmentit . doSegment ( '工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作。' ) ;
console . log ( result ) ; (実際、それはすべての呼び出し、初期化、その他のものにSegmentit.追加するためだけです)
st音スタイルの単語カテゴリのタグ:
// import Segment, { useDefault, cnPOSTag, enPOSTag } from 'segmentit';
const { Segment , useDefault , cnPOSTag , enPOSTag } = require ( 'segmentit' ) ;
const segmentit = useDefault ( new Segment ( ) ) ;
console . log ( segmentit . doSegment ( '一人得道,鸡犬升天' ) . map ( i => ` ${ i . w } < ${ cnPOSTag ( i . p ) } > < ${ enPOSTag ( i . p ) } >` ) )
// ↑ ["一人得道 <习语,数词 数语素> <l,m>", ", <标点符号> <w>", "鸡犬升天 <成语> <i>"] UsedEfaultの特定の実装は次のとおりです。
// useDefault
import { Segment , modules , dicts , synonyms , stopwords } from 'segmentit' ;
const segmentit = new Segment ( ) ;
segmentit . use ( modules ) ;
segmentit . loadDict ( dicts ) ;
segmentit . loadSynonymDict ( synonyms ) ;
segmentit . loadStopwordDict ( stopwords ) ;そのため、実際に辞書とモジュールの必要な部分をインポートしてから、1つずつダウンロードできます。これらの辞書やインポートのないモジュールは、Webpackのツリーの揺れによって削除する必要があります。また、独自の定義済み辞書ファイルをこの方法でロードすることもできます。メインロードディクトの関数署名(dicts: string | string[]): Segmentが必要です。
// load custom module and dicts
import {
Segment ,
ChsNameTokenizer ,
DictOptimizer ,
EmailOptimizer ,
PunctuationTokenizer ,
URLTokenizer ,
ChsNameOptimizer ,
DatetimeOptimizer ,
DictTokenizer ,
ForeignTokenizer ,
SingleTokenizer ,
WildcardTokenizer ,
pangu ,
panguExtend1 ,
panguExtend2 ,
names ,
wildcard ,
synonym ,
stopword ,
} from 'segmentit' ;
const segmentit = new Segment ( ) ;
// load them one by one, or by array
segmentit . use ( ChsNameTokenizer ) ;
segmentit . loadDict ( pangu ) ;
segmentit . loadDict ( [ panguExtend1 , panguExtend2 ] ) ;
segmentit . loadSynonymDict ( synonym ) ;
segmentit . loadStopwordDict ( stopword ) ;Pangueの辞書は比較的レトロで、「柔らかくかわいいロリ」のような言葉はありません。あなた自身の語彙についてはPRしてください。
トークンザーは、単語を分inするときに通過する必要があるミドルウェアです。 Reduxのミドルウェアと同様に、その分割関数は分詞の半分を持つトークンアレイを受け入れ、同じ形式のトークン配列を返します(これが、長すぎるテキスト単語で分割されるべきではない理由です。そうしないと、この配列は巨大になります)。
例は次のとおりです。
// @flow
import { Tokenizer } from 'segmentit' ;
import type { SegmentToken , TokenStartPosition } from 'segmentit' ;
export default class ChsNameTokenizer extends Tokenizer {
split ( words : Array < SegmentToken > ) : Array < SegmentToken > {
// 可以获取到 this.segment 里的各种信息
const POSTAG = this . segment . POSTAG ;
const TABLE = this . segment . getDict ( 'TABLE' ) ;
// ...
}オプティマイザーは、分詞が終わった後にヒューリスティックなルールを配置できる場所であり、辞書処理を使用することは困難であることがわかっていますが、ヒューリスティックルールで処理できる場合、これらのヒューリスティックルールを配置できます。そのDOOPTIMIZE機能もトークンアレイを受信し、同じ形式のトークン配列を返します。
トークンアレイに加えて、残りのパラメーターをカスタマイズすることもできます。たとえば、次の例では、1回再帰的に自分自身を呼び出し、2番目のパラメーターを介して再帰的な深さを判断します。
// @flow
import { Optimizer } from './BaseModule' ;
import type { SegmentToken } from './type' ;
export default class DictOptimizer extends Optimizer {
doOptimize ( words : Array < SegmentToken > , isNotFirst : boolean ) : Array < SegmentToken > {
// 可以获取到 this.segment 里的各种信息
const POSTAG = this . segment . POSTAG ;
const TABLE = this . segment . getDict ( 'TABLE' ) ;
// ...
// 针对组合数字后无法识别新组合的数字问题,需要重新扫描一次
return isNotFirst === true ? words : this . doOptimize ( words , true ) ;
}たとえば、あらゆる種類の単語セグメンテーションツールは、「赤いパンティーの一部」の赤と音声の一部に一致することはできませんが、SegmentITでは、単純な形容詞の形容詞を処理するために追加しました。
// @flow
// https://github.com/linonetwo/segmentit/blob/master/src/module/AdjectiveOptimizer.js
import { Optimizer } from './BaseModule' ;
import type { SegmentToken } from './type' ;
import { colors } from './COLORS' ;
// 把一些错认为名词的词标注为形容词,或者对名词作定语的情况
export default class AdjectiveOptimizer extends Optimizer {
doOptimize ( words : Array < SegmentToken > ) : Array < SegmentToken > {
const { POSTAG } = this . segment ;
let index = 0 ;
while ( index < words . length ) {
const word = words [ index ] ;
const nextword = words [ index + 1 ] ;
if ( nextword ) {
// 对于<颜色>+<的>,直接判断颜色是形容词(字典里颜色都是名词)
if ( nextword . p === POSTAG . D_U && colors . includes ( word . w ) ) {
word . p = POSTAG . D_A ;
}
// 如果是连续的两个名词,前一个是颜色,那这个颜色也是形容词
if ( word . p === POSTAG . D_N && nextword . p === POSTAG . D_N && colors . includes ( word . w ) ) {
word . p = POSTAG . D_A ;
}
}
// 移到下一个单词
index += 1 ;
}
return words ;
}
} MITライセンス