이 모듈은 노드 세그먼트 매직 수정을 기반으로하며 전자 및 브라우저 지원을 추가하며 전자 다중 스레드 런닝 환경에 최적화 될 준비가되었습니다.
우리가 수정하는 데 시간을 소비 해야하는 이유는 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. 추가하는 것입니다)
말더듬 스타일로 된 단어 카테고리의 태그 :
// 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
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의 나무 흔들림으로 제거해야합니다. 이런 방식으로 자신의 정의 된 사전 파일을로드 할 수 있습니다. 기본 부하 데이터의 함수 서명이 필요합니다 (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의 사전은 상대적으로 복고풍이며“부드럽고 귀여운 Loli”와 같은 단어는 없습니다. 자신의 어휘를 위해 PR.
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' ) ;
// ...
}Optimizer는 분사라는 단어가 끝난 후 휴리스틱 규칙을 배치 할 수있는 곳이며 사전 처리를 사용하기가 어렵지만 휴리스틱 규칙으로 처리 할 수있는 경우 이러한 휴리스틱 규칙을 배치 할 수 있습니다. 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에서는 간단한 aDjectiveOptimizer를 추가하여 다음을 처리합니다.
// @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 라이센스