تعتمد هذه الوحدة على تعديل سحرية قطاع العقدة ، ويضيف دعم الإلكترون والمتصفح ، وهو جاهز لتحسينه لبيئة التشغيل الإلكترونية متعددة الخيوط.
السبب في أننا نحتاج إلى قضاء بعض الوقت لتعديله هو أنه على الرغم من أن segment و nodejieba مفيدون للغاية في بيئات العقدة ، إلا أنه لا يمكن تشغيله في بيئات المتصفح والإلكترون على الإطلاق. لقد قمت بإعادة تمهيد الكود إلى ES2015 وضغط ملف القاموس مع المكون الإضافي بابل. الحجم هو 3.8 متر إذا تم تحميله. ومع ذلك ، إذا لم تكن بحاجة إلى بعض القواميس ، فإن القاموس والوحدات النمطية يدعم اهتزاز الأشجار (يرجى استخدام وحدة 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/segressit.js"
const segmentit = Segmentit . useDefault ( new Segmentit . Segment ( ) ) ;
const result = segmentit . doSegment ( '工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作。' ) ;
console . log ( result ) ; (في الواقع ، هو مجرد إضافة Segmentit. إلى جميع المكالمات والتهيئة والأشياء الأخرى)
علامات فئة الكلمات بأسلوب التأتأة:
// 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>"] التنفيذ المحدد لـ ediefault هو كما يلي:
// 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 ) ; بحيث يمكنك في الواقع استيراد الجزء المطلوب من القاموس والوحدات النمطية ثم تنزيلها واحدة تلو الأخرى. يجب إزالة هذه القواميس والوحدات النمطية التي لا تستورد عن طريق هز شجرة WebPack. يمكنك أيضًا تحميل ملف القاموس المحدد الخاص بك بهذه الطريقة ، فقط بحاجة إلى توقيع الوظيفة لـ LoadDict الرئيسي ليكون (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 ) ;قاموس Pangu’s Retro نسبيًا ، ولا توجد كلمات مثل "LOLI لينة ولطيفة". يرجى العلاقات العامة لمفرداتك الخاصة.
Tokenizer هو برامج وسيطة يجب مرورها عند الكلمات المشاركة. على غرار البرامج الوسيطة لـ 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 أيضًا مجموعة رمزية وتُرجع مجموعة رمزية من نفس التنسيق.
بالإضافة إلى صفيف الرمز المميز ، يمكنك أيضًا تخصيص المعلمات المتبقية. على سبيل المثال ، في المثال التالي ، سوف نسمي أنفسنا بشكل متكرر مرة واحدة ونحكم على العمق العودية من خلال المعلمة الثانية:
// @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 ;
}
} معهد ماساتشوستس للتكنولوجيا مرخصة