Modul ini didasarkan pada modifikasi ajaib segmen node, menambahkan dukungan elektron dan browser, dan siap untuk dioptimalkan untuk lingkungan lari multi-threaded elektron.
Alasan mengapa kita perlu menghabiskan waktu untuk memodifikasi adalah bahwa meskipun segment dan nodejieba sangat berguna di lingkungan simpul, mereka tidak dapat berjalan di lingkungan browser dan elektron sama sekali. Saya refactored kode ke ES2015 dan mengapit file kamus dengan plugin Babel. Ukurannya 3,8m jika dimuat. Namun, jika Anda tidak memerlukan kamus, kamus dan modul mendukung pengocok pohon (silakan gunakan modul 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 ) ;Untuk lingkungan runkit:
const { Segment , useDefault } = require ( 'segmentit' ) ;
const segmentit = useDefault ( new Segment ( ) ) ;
const result = segmentit . doSegment ( '工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作。' ) ;
console . log ( result ) ;Uji coba gratis di runkit
Contoh Penggunaan Browser Langsung:
Pertama, silakan mengutip "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 ) ; (Faktanya, ini hanya untuk menambahkan Segmentit. ke semua panggilan, inisialisasi dan hal -hal lain)
Tag kategori kata dalam gaya gagap:
// 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>"] Implementasi spesifik dari UsedFault adalah sebagai berikut:
// 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 ) ; Jadi Anda benar -benar dapat mengimpor bagian yang diperlukan dari kamus dan modul dan kemudian mengunduhnya satu per satu. Kamus dan modul tanpa impor harus dihapus oleh pohon webpack bergetar. Anda juga dapat memuat file kamus yang ditentukan sendiri dengan cara ini, hanya perlu tanda tangan fungsi loaddict utama untuk menjadi (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 ) ;Kamus Pangu relatif retro, dan tidak ada kata -kata seperti "Loli Lembut dan Lucu". Tolong PR untuk kosa kata Anda sendiri.
Tokenizer adalah middleware yang perlu dilewati saat kata -kata yang berpartisipasi. Mirip dengan middleware Redux, fungsi splitnya menerima array token dengan setengah dari participle dan mengembalikan array token dari format yang sama (inilah mengapa tidak boleh dipesona dengan kata -kata teks yang terlalu panjang, jika tidak, array ini akan sangat besar).
Contohnya adalah sebagai berikut:
// @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' ) ;
// ...
}Pengoptimal adalah tempat di mana aturan heuristik dapat ditempatkan setelah kata participle selesai dan ditemukan bahwa sulit untuk menggunakan pemrosesan kamus, tetapi ketika dapat diproses dengan aturan heuristik, ia dapat menempatkan aturan heuristik ini. Fungsi dooptimize -nya juga menerima array token dan mengembalikan array token dari format yang sama.
Selain array token, Anda juga dapat menyesuaikan parameter yang tersisa. Misalnya, dalam contoh berikut, kita akan menyebut diri kita secara rekursif sekali dan menilai kedalaman rekursif melalui parameter kedua:
// @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 ) ;
}Misalnya, semua jenis alat segmentasi kata tidak dapat cocok dengan merah di "bagian celana merah" dengan bagian dari pidato, tetapi di segmentit saya menambahkan kata sifat sederhana untuk menanganinya:
// @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 berlisensi