Dieses Modul basiert auf der magischen Modifikation von Knotensegments, fügt Elektronen- und Browserunterstützung hinzu und ist bereit, für die Elektronen-Multi-Threaded-Laufumgebung optimiert zu werden.
Der Grund, warum wir Zeit für die Änderung verbringen müssen, ist, dass segment und nodejieba zwar in Knotenumgebungen sehr nützlich sind, sie jedoch in Browser- und Elektronenumgebungen überhaupt nicht ausgeführt werden können. Ich habe den Code in ES2015 übernommen und die Wörterbuchdatei mit dem Babel -Plugin eingegeben. Die Größe beträgt 3,8 m, wenn sie geladen ist. Wenn Sie jedoch keine Wörterbücher benötigen, unterstützen das Wörterbuch und die Module Baumschütteln (bitte verwenden Sie das ESM -Modul).
< 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 ) ;Für Runkit -Umgebung:
const { Segment , useDefault } = require ( 'segmentit' ) ;
const segmentit = useDefault ( new Segment ( ) ) ;
const result = segmentit . doSegment ( '工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作。' ) ;
console . log ( result ) ;Kostenlose Testversion auf Runkit
Beispiele für den direkten Browser -Gebrauch:
Bitte zitieren Sie zuerst "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 ) ; (In der Tat ist nur Segmentit. zu allen Aufrufen, Initialisierung und anderen Dingen hinzugefügt)
Tags der Wortkategorie im Stotternstil:
// 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>"] Die spezifische Implementierung von Gebrauchsefault ist wie folgt:
// 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 ) ; So können Sie den erforderlichen Teil des Wörterbuchs und der Module tatsächlich importieren und sie dann einzeln herunterladen. Diese Wörterbücher und Module ohne Import sollten durch das Zittern von Webpacks Baum entfernt werden. Sie können auch Ihre eigene definierte Wörterbuchdatei auf diese Weise laden. Sie benötigen nur die Funktionssignatur des Hauptlastdicts (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 ) ;Das Wörterbuch von Pangu ist relativ retro und es gibt keine Worte wie "weich und niedlich Loli". Bitte PR für Ihren eigenen Wortschatz.
Tokenizer ist eine Middleware, die bei teilnehmenden Worten durchlaufen werden muss. Ähnlich wie bei Reduxs Middleware akzeptiert seine Split -Funktion ein Token -Array mit der Hälfte des Partizips und gibt ein Token -Array desselben Formats zurück (aus diesem Grund sollte es nicht mit zu langen Textwörtern beteiligt sein, sonst ist dieses Array riesig).
Beispiele sind wie folgt:
// @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' ) ;
// ...
}Optimierer ist ein Ort, an dem die heuristischen Regeln aufgestellt werden können, nachdem das Wort Partizip vorbei ist, und es wird festgestellt, dass es schwierig ist, die Wörterbuchverarbeitung zu verwenden. Wenn es jedoch mit heuristischen Regeln verarbeitet werden kann, kann diese heuristischen Regeln platziert werden. Seine Dooptimize -Funktion erhält auch ein Token -Array und gibt ein Token -Array desselben Formats zurück.
Zusätzlich zum Token -Array können Sie auch die verbleibenden Parameter anpassen. Zum Beispiel werden wir im folgenden Beispiel einmal einmal rekursiv aufrufen und die rekursive Tiefe durch den zweiten Parameter beurteilen:
// @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 ) ;
}Beispielsweise können alle Arten von Word -Segmentierungstools nicht mit dem Rot in "Teil der roten Höschen" mit dem Teil der Sprache übereinstimmen, aber in Segmentit habe ich einen einfachen Adjektivenoptimizer hinzugefügt, um damit umzugehen:
// @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 lizenziert