AHA Natural Language Processing Package는 HANLP , Word2VEC , Mate-Tools 및 기타 프로젝트를 통합하여 고품질 중국 자연 언어 처리 서비스를 제공합니다.
AHANLP 가 제공하는 현재 기능은 다음과 같습니다.
AHANLP.JAR 의 최신 버전 및 해당 기본 데이터 패킷 AHANLP_BASE 는 여기를 클릭하여 다운로드하십시오. 구성 파일 ahanlp.properties 및 hanlp.properties는 classPath에 넣습니다. 대부분의 프로젝트의 경우 SRC 디렉토리에만 적용하면됩니다. IDE는 편집하는 동안 자동으로 클래스 경로에 복사합니다.
AHANLP는 HANLP의 데이터 구성 구조, 코드 및 데이터 분리를 따릅니다. 사용자는 필요에 따라 해당 데이터 패킷을 선택할 수 있습니다.
dictionary 디렉토리 및 model 디렉토리는 프로젝트의 data/ 디렉토리에 저장됩니다.data/model/ 디렉토리에 저장하십시오.python -m pip install xxx.whl 사용하여 설치). 그런 다음 Word_cloud (추출 코드 9JB6)를 다운로드하고 추출 된 word_cloud 폴더를 Project Root 디렉토리에 배치하십시오.AHANLP 프로젝트의 모든 매개 변수는 구성 파일 (사용자 수정이 권장되지 않음)에서 읽히고 다음은 간단한 설명입니다.
기본 구성 파일은 ahanlp.properties 이며 Word2Vec 모델 경로를 구성해야하며 기본값은 IS입니다.
word2vecModel = data/model/wiki_chinese_word2vec(Google).model
hanLDAModel = data/model/SogouCS_LDA.model
srlTaggerModel = data/model/srl/CoNLL2009-ST-Chinese-ALL.anna-3.3.postagger.model
srlParserModel = data/model/srl/CoNLL2009-ST-Chinese-ALL.anna-3.3.parser.model
srlModel = data/model/srl/CoNLL2009-ST-Chinese-ALL.anna-3.3.srl-4.1.srl.model
wordCloudPath = word_cloud/
pythonCMD = python
HANLP 구성 파일은 hanlp.properties 입니다. 데이터 디렉토리가 첫 번째 줄에있는 경로 만 설정하면됩니다. 기본값은입니다
root=./
참고 : 의미 론적 역할 라벨링 모듈에는 높은 메모리 발자국이 있습니다. 이 기능을 사용하려면 JVM의 최대 메모리 풋 프린트를 4GB로 설정하십시오.
AHANLP 의 거의 모든 기능은 도구 클래스 AHANLP 통해 빠르게 호출 할 수 있습니다. 또한 사용자는 항상 도구 클래스 AHANLP를 통해 호출하므로 AHANLP가 향후 업그레이드 된 후 사용자는 호출 코드를 수정할 필요가 없습니다.
모든 데모는 아래 소개 문서보다 자세한 내용을 다루며 테스트 중에 있습니다. 한 번 실행하는 것이 좋습니다. 확인할 수도 있습니다.
AHANLP 인터페이스 문서 .
String content = "苏州大学的周国栋教授正在教授自然语言处理课程。" ;
// 标准分词
List < Term > stdSegResult = AHANLP . StandardSegment ( content );
System . out . println ( stdSegResult );
//[苏州大学/ntu, 的/ude1, 周/qt, 国栋/nz, 教授/nnt, 正在/d, 教授/nnt, 自然语言处理/nz, 课程/n, 。/w]
// NLP分词
List < Term > nlpSegResult = AHANLP . NLPSegment ( content );
System . out . println ( nlpSegResult );
//[苏州大学/ntu, 的/u, 周国栋/nr, 教授/n, 正在/d, 教授/v, 自然语言处理/nz, 课程/n, 。/w]표준 세그먼트는 HMM-Bigram 모델을 캡슐화하고 가장 짧은 회로 방법을 사용하여 단어를 나누어 효율성과 효과를 모두 고려하여 단어를 나누어줍니다 (Viterbi 알고리즘을 사용합니다). NLP 분사 (NLPSEGMENT)는 구조화 된 퍼셉트론 시퀀스 라벨링 프레임 워크에 의해 지원되는 퍼셉트론 모델을 캡슐화하고 동시에 부분-연사 주석 및 명명 엔티티 인식을 수행하며, 정확도가 높고 생산 환경에서 사용하기에 적합합니다.
단어 분사의 기본 반환 결과에는 단어와 음성의 일부가 포함됩니다. AHANLP.getWordList(stdSegResult) 와 AHANLP.getNatureList(stdSegResult) 에 의해 각각 음성 목록의 단어 또는 일부를 얻을 수 있습니다. 부품 주석에 대해서는 "HANLP PART-OF SCEECH DENOTATION COLLECT"를 참조하십시오.
부품 연설 필터링을 사용자 정의 해야하는 경우 me.xiaosheng.chnlp.seg.POSFilter 클래스를 사용할 수 있으며 구두점 필터링 및 실제 단어 유지와 같은 일반적인 메소드도 구현할 수 있습니다.
// 过滤标点
POSFilter . removePunc ( stdSegResult );
// 保留名词
POSFilter . selectPOS ( stdSegResult , Arrays . asList ( "n" , "ns" , "nr" , "nt" , "nz" ));위의 단어 분사라는 단어는 중지 단어의 필터링을 지원하고 두 번째 매개 변수를 가져 와서 true로 설정합니다.
List < Term > stdSegResult = AHANLP . NLPSegment ( content , true );
List < String > stdWordList = AHANLP . getWordList ( stdSegResult );
System . out . println ( stdWordList );
//[苏州大学, 周国栋, 教授, 正在, 教授, 自然语言处理, 课程] 단어 세분화는 사용자 정의 사전을 지원합니다. HANLP는 CustomDictionary 클래스를 사용하여이를 표현합니다. 모든 어휘에 영향을 미치는 글로벌 사용자 정의 사전입니다. 사전 텍스트 경로는 data/dictionary/custom/CustomDictionary.txt 이며 사용자가 자신의 단어를 추가 할 수 있습니다 (권장되지 않음). 새 텍스트 파일을 별도로 만들고 구성 파일 CustomDictionaryPath=data/dictionary/custom/CustomDictionary.txt; 我的词典.txt; (권장).
사전 형식 :
[单词] [词性A] [A的频次] [词性B] [B的频次] ...全国地名大全.txt ns; 연설의 일부가 뒤 따르는 공간에 즉시 말하면, 사전은 연설의 일부로 기본적으로 불이행됩니다.** 참고 : **이 프로그램은 기본적으로 Cache Files (filename.txt.bin 또는 filename.txt.trie.dat 및 filename.txt.trie.value)에서 사전을 읽습니다. 사전을 수정하면 캐시 만 삭제하면 적용됩니다.
List < List < Term >> segResults = AHANLP . seg2sentence ( "Standard" , content , true );
for ( int i = 0 ; i < senList . size (); i ++)
System . out . println (( i + 1 ) + " : " + AHANLP . getWordList ( results . get ( i )));긴 텍스트에 문장별로 단어를 분할하는 것은 일반적으로 사용되며 단어 분사의 모든 문장으로 구성된 결과 목록을 반환합니다. 워드 세그먼테르의 유형은 첫 번째 segtype 매개 변수를 통해 제어됩니다. "표준"은 표준 워드 세그먼트에 해당하고 "NLP"는 NLP 분사에 해당합니다.
물론, 문장을 수동으로 깨뜨린 다음 여러 문장으로 나눌 수도 있습니다.
List < String > senList = AHANLP . splitSentence ( content );
List < List < Term >> senWordList = AHANLP . splitWordInSentences ( "Standard" , senList , true );
for ( int i = 0 ; i < senWordList . size (); i ++)
System . out . println (( i + 1 ) + " : " + senWordList . get ( i )); String sentence = "2013年9月,习近平出席上合组织比什凯克峰会和二十国集团圣彼得堡峰会,"
+ "并对哈萨克斯坦等中亚4国进行国事访问。在“一带一路”建设中,这次重大外交行程注定要被历史铭记。" ;
List < NERTerm > NERResult = AHANLP . NER ( sentence );
System . out . println ( NERResult );
//[中亚/loc, 习近平/per, 上合组织/org, 二十国集团/org, 哈萨克斯坦/loc, 比什凯克/loc, 圣彼得堡/loc, 2013年9月/time] Perceptron 및 CRF 모델은 구조화 된 Perceptron 시퀀스 라벨링 프레임 워크에 의해 지원되는 캡슐화되며, 텍스트의 시간, 장소 이름, 사람 이름 및 조직 이름은 다음을 식별합니다. 사람 이름 per , 장소 이름 loc , 조직 이름 org 및 time .
String sentence = "北京是中国的首都" ;
CoNLLSentence deps = AHANLP . DependencyParse ( sentence );
for ( CoNLLWord dep : deps )
System . out . printf ( "%s --(%s)--> %s n " , dep . LEMMA , dep . DEPREL , dep . HEAD . LEMMA );
/*
北京 --(主谓关系)--> 是
是 --(核心关系)--> ##核心##
中国 --(定中关系)--> 首都
的 --(右附加关系)--> 中国
首都 --(动宾关系)--> 是
*/
// 词语依存路径
List < List < Term >> wordPaths = AHANLP . getWordPathsInDST ( sentence );
for ( List < Term > wordPath : wordPaths ) {
System . out . println ( wordPath . get ( 0 ). word + " : " + AHANLP . getWordList ( wordPath ));
}
/*
北京 : [北京, 是]
是 : [是]
中国 : [中国, 首都, 是]
的 : [的, 中国, 首都, 是]
首都 : [首都, 是]
*/
// 依存句法树前2层的词语
List < String > words = AHANLP . getTopWordsInDST ( sentence , 1 );
System . out . println ( words );
// [北京, 是, 首都] 의존성 구문 분석은 신경망을 기반으로 한 고성능 의존성 구문 분석기를 사용하여 HANLP의 NeuralnetworkDependenCyParser의 캡슐화입니다. 분석 결과는 Conll 형식이며 Conllword 유형에 따라 반복 할 수 있습니다. 위에서 볼 수 있듯이 CoNLLWord.LEMMA 는 노예 단어, CoNLLWord.HEAD.LEMMA 는 지배적 인 단어이며 CoNLLWord.DEPREL 은 종속 레이블이며 기본값은 중국 레이블로 기본적으로 표시됩니다.
영어 레이블을 사용해야하는 경우 두 번째 매개 변수를 가져와 True로 설정하십시오.
CoNLLSentence enDeps = AHANLP.DependencyParse(sentence, true);
종속성 태그에 대한 자세한 설명은 "종속성 태그"를 참조하십시오.
String document = "我国第二艘航空母舰下水仪式26日上午在中国船舶重工集团公司大连造船厂举行。航空母舰在拖曳牵引下缓缓移出船坞,停靠码头。目前,航空母舰主船体完成建造,动力、电力等主要系统设备安装到位。" ;
List < String > wordList = AHANLP . extractKeyword ( document , 5 );
System . out . println ( wordList );
//[航空母舰, 动力, 建造, 牵引, 完成]추출 Keyword 함수는 두 번째 매개 변수를 통해 리턴 된 키워드 수를 설정합니다. 각 단어의 순위 값은 TexTrank 알고리즘을 통해 내부적으로 계산되어 순위 값의 내림차순으로 배열되어 이전 몇 가지를 키워드로 추출합니다. 특정 원칙은 "TexTrank 알고리즘 추출 키워드 및 초록"을 참조하십시오.
String document = "我国第二艘航空母舰下水仪式26日上午在中国船舶重工集团公司大连造船厂举行。"
+ "按照国际惯例,剪彩后进行“掷瓶礼”。随着一瓶香槟酒摔碎舰艏,两舷喷射绚丽彩带,周边船舶一起鸣响汽笛,全场响起热烈掌声。"
+ "航空母舰在拖曳牵引下缓缓移出船坞,停靠码头。第二艘航空母舰由我国自行研制,2013年11月开工,2015年3月开始坞内建造。" + "目前,航空母舰主船体完成建造,动力、电力等主要系统设备安装到位。"
+ "出坞下水是航空母舰建设的重大节点之一,标志着我国自主设计建造航空母舰取得重大阶段性成果。" + "下一步,该航空母舰将按计划进行系统设备调试和舾装施工,并全面开展系泊试验。" ;
List < String > senList = AHANLP . extractKeySentence ( document , 5 );
System . out . println ( "Key Sentences: " );
for ( int i = 0 ; i < senList . size (); i ++)
System . out . println (( i + 1 ) + " : " + senList . get ( i ));
System . out . println ( "Summary: " );
System . out . println ( AHANLP . extractSummary ( document , 50 ));
/*
Key Sentences:
1 : 航空母舰主船体完成建造
2 : 该航空母舰将按计划进行系统设备调试和舾装施工
3 : 我国第二艘航空母舰下水仪式26日上午在中国船舶重工集团公司大连造船厂举行
4 : 标志着我国自主设计建造航空母舰取得重大阶段性成果
5 : 出坞下水是航空母舰建设的重大节点之一
Summary:
我国第二艘航空母舰下水仪式26日上午在中国船舶重工集团公司大连造船厂举行。航空母舰主船体完成建造。
*/ExtractKeynessentence 함수는 주요 문장을 추출하는 데 도움이되며, 두 번째 매개 변수는 추출 된 주요 문장의 수를 제어합니다. ExtractSummary 함수는 자동 요약을 담당하며 두 번째 매개 변수는 요약 단어 수의 상한을 설정합니다. 각 문장의 순위 값은 TexTrank 알고리즘을 통해 내부적으로 계산되며 순위 값의 내림차순으로 배열되어 이전 몇 가지를 주요 문장으로 추출합니다. 자동 요약은 비슷하며 원본 텍스트의 문장의 위치와 문장의 길이를 고려합니다. 특정 원칙은 "TexTrank 알고리즘 추출 키워드 및 초록"을 참조하십시오.
문장 사이의 유사성 정도 (즉, TexTrank 알고리즘의 가중치)는 Word2Vec에서 제공하는 함수를 사용하여 계산됩니다. Wikipedia의 중국 코퍼스에서 훈련 된 모델은 기본적으로 사용되며 사용자 정의 모델도 사용할 수 있습니다.
System . out . println ( "猫 | 狗 : " + AHANLP . wordSimilarity ( "猫" , "狗" ));
System . out . println ( "计算机 | 电脑 : " + AHANLP . wordSimilarity ( "计算机" , "电脑" ));
System . out . println ( "计算机 | 男人 : " + AHANLP . wordSimilarity ( "计算机" , "男人" ));
String s1 = "苏州有多条公路正在施工,造成局部地区汽车行驶非常缓慢。" ;
String s2 = "苏州最近有多条公路在施工,导致部分地区交通拥堵,汽车难以通行。" ;
String s3 = "苏州是一座美丽的城市,四季分明,雨量充沛。" ;
System . out . println ( "s1 | s1 : " + AHANLP . sentenceSimilarity ( s1 , s1 ));
System . out . println ( "s1 | s2 : " + AHANLP . sentenceSimilarity ( s1 , s2 ));
System . out . println ( "s1 | s3 : " + AHANLP . sentenceSimilarity ( s1 , s3 ));
/*
猫 | 狗 : 0.71021223
计算机 | 电脑 : 0.64130974
计算机 | 男人 : -0.013071457
s1 | s1 : 1.0
s1 | s2 : 0.6512632
s1 | s3 : 0.3648093
*/ Wordsimilarity 와 문장 유사성은 각각 단어와 문장의 유사성을 계산하는 기능입니다. 계산 프로세스는 Word2Vec 모델에 의해 미리 훈련 된 단어 벡터를 사용합니다. 사용하기 전에 Word2Vec 모델을 다운로드 한 다음 DeMompressed 모델 파일을 프로젝트의 data/model/ 디렉토리에 저장해야합니다. 단어 유사성은 벡터 코사인 값이라는 단어를 계산하여 직접 계산됩니다. 문장 유사성을 얻는 방법에 대해서는 Word2Vec/issues1을 참조 할 수 있습니다. Word2Vec 모델을 직접 교육하려면 Google 버전의 모델을 참조하십시오.
참고 : SentenceMilarity는 표준 단어 세분화를 사용하여 기본적으로 문장을 분할하고 중지 단어를 필터링합니다.
String sentence = "全球最大石油生产商沙特阿美(Saudi Aramco)周三(7月21日)证实,公司的一些文件遭泄露。" ;
List < SRLPredicate > predicateList = AHANLP . SRL ( sentence );
for ( SRLPredicate p : predicateList ) {
System . out . print ( "谓词: " + p . getPredicate ());
System . out . print ( " t t句内偏移量: " + p . getLocalOffset ());
System . out . print ( " t句内索引: [" + p . getLocalIdxs ()[ 0 ] + ", " + p . getLocalIdxs ()[ 1 ] + "] n " );
for ( Arg arg : p . getArguments ()) {
System . out . print ( " t " + arg . getLabel () + ": " + arg . getSpan ());
System . out . print ( " t t句内偏移量: " + arg . getLocalOffset ());
System . out . print ( " t句内索引: [" + arg . getLocalIdxs ()[ 0 ] + ", " + arg . getLocalIdxs ()[ 1 ] + "] n " );
}
System . out . println ();
}
/*
谓词: 证实 句内偏移量: 36 句内索引: [36, 37]
TMP: 周三(7月21日) 句内偏移量: 27 句内索引: [27, 35]
A0: 全球最大石油生产商沙特阿美(Saudi Aramco) 句内偏移量: 0 句内索引: [0, 26]
A1: 公司的一些文件遭泄露 句内偏移量: 39 句内索引: [39, 48]
谓词: 遭 句内偏移量: 46 句内索引: [46, 46]
A0: 公司的一些文件 句内偏移量: 39 句内索引: [39, 45]
A1: 泄露 句内偏移量: 47 句内索引: [47, 48]
*/ Mate-Tools의 SRL 구성 요소 (부분-연사 인식기 및 종속 구문 분석기 포함)는 텍스트의 predicate 를 식별 할 수 있으며 해당 인수 : Agent A0 , 수신자 A1 , Time TMP 및 Location LOC . 긴 텍스트 SRLPARSECONTENT (컨텐츠) 및 일치하는 텍스트 오프셋에 대한 지원을 추가했습니다.
참고 : 각 술집은 특정 범주에서 하나 이상의 인수에 해당합니다. 예를 들어, 술어 "공격"은 여러 활성화 제 A0 (공격자)에 해당 할 수 있습니다.
int topicNum510 = AHANLP . topicInference ( "data/mini/军事_510.txt" );
System . out . println ( "军事_510.txt 最可能的主题号为: " + topicNum510 );
int topicNum610 = AHANLP . topicInference ( "data/mini/军事_610.txt" );
System . out . println ( "军事_610.txt 最可能的主题号为: " + topicNum610 );LDA 주제 예측 기본적으로 뉴스 LDA 모델은 주제를 예측하는 데 사용되며 최대 확률이있는 주제 번호는 출력입니다. 기본 모델은 Sogou News Corpus (Sogoucs)의 각 카테고리에서 1,000 (불만족) 뉴스에서 총 100 개의 주제로 훈련되었습니다.
사용자는 ZHNLP.trainLDAModel() 을 통해 LDA 모델을 스스로 교육 할 수 있습니다. 훈련 후 과부하 된 topicInference 메소드를 사용하여로드 할 수 있습니다.
AHANLP . trainLDAModel ( "data/mini/" , 10 , "data/model/testLDA.model" );
int topicNum710 = AHANLP . topicInference ( "data/model/testLDA.model" , "data/mini/军事_710.txt" );
System . out . println ( "军事_710.txt 最可能的主题号为: " + topicNum710 );
int topicNum810 = AHANLP . topicInference ( "data/model/testLDA.model" , "data/mini/军事_810.txt" );
System . out . println ( "军事_810.txt 最可能的主题号为: " + topicNum810 ); 테스트를 위해 ldademo.java를 실행 해야하는 경우 Sogouca_mini를 다운로드하고 추출 된 mini 폴더를 프로젝트 data/ 디렉토리에 저장해야합니다.
String tc = AHANLP . convertSC2TC ( "用笔记本电脑写程序" );
System . out . println ( tc );
String sc = AHANLP . convertTC2SC ( "「以後等妳當上皇后,就能買士多啤梨慶祝了」" );
System . out . println ( sc );
/*
用筆記本電腦寫程序
“以后等你当上皇后,就能买草莓庆祝了”
*/ 단순하고 전통적인 중국의 전환은 HANLP에서 convertToTraditionalChinese 및 convertToSimplifiedChinese 방법의 포장지입니다.打印机=印表機와 같은 단순하고 전통적인 중국어로 나뉘어있는 단어를 식별 할 수 있습니다. 그리고 "年"및 "Queen"의 두 "年"와 같은 단순하고 전통적인 중국 전환 도구로 구별 할 수없는 많은 캐릭터.
String document = "我国第二艘航空母舰下水仪式26日上午在中国船舶重工集团公司大连造船厂举行。" + "中共中央政治局委员、中央军委副主席范长龙出席仪式并致辞。9时许,仪式在雄壮的国歌声中开始。"
+ "按照国际惯例,剪彩后进行“掷瓶礼”。随着一瓶香槟酒摔碎舰艏,两舷喷射绚丽彩带,周边船舶一起鸣响汽笛,全场响起热烈掌声。"
+ "航空母舰在拖曳牵引下缓缓移出船坞,停靠码头。第二艘航空母舰由我国自行研制,2013年11月开工,2015年3月开始坞内建造。" + "目前,航空母舰主船体完成建造,动力、电力等主要系统设备安装到位。"
+ "出坞下水是航空母舰建设的重大节点之一,标志着我国自主设计建造航空母舰取得重大阶段性成果。" + "下一步,该航空母舰将按计划进行系统设备调试和舾装施工,并全面开展系泊试验。"
+ "海军、中船重工集团领导沈金龙、苗华、胡问鸣以及军地有关部门领导和科研人员、干部职工、参建官兵代表等参加仪式。" ;
List < String > wordList = AHANLP . getWordList ( AHANLP . StandardSegment ( document , true ));
WordCloud wc = new WordCloud ( wordList );
try {
wc . createImage ( "D: \ test.png" );
} catch ( IOException e ) {
e . printStackTrace ();
} WordCloud는 Word List를 사용하여 WordCloud 객체를 작성한 다음 createImage 메소드를 호출하여 Word Cloud Image를 작성하고 이미지의 저장된 주소를 매개 변수로 전달합니다. 단어 클라우드는 단어 주파수에 따라 각 단어의 크기를 그립니다. 단어 주파수가 높을수록 단어가 더 커집니다. 색상과 위치는 무작위로 생성됩니다.

기본 생성 이미지 크기는 500x400이고 배경색은 흰색입니다. 이미지의 배경색 및 이미지 크기를 사용자 정의 할 수도 있습니다.
WordCloud wc = new WordCloud ( wordList );
wc . createImage ( "D: \ test_black.png" , true ); // 黑色背景
wc . createImage ( "D: \ test_1000x800.png" , 1000 , 800 ); // 尺寸 1000x800
wc . createImage ( "D: \ test_1000x800_black.png" , 1000 , 800 , true ); // 尺寸 1000x800, 黑色背景자연어 처리 기술의 대중화 및 적용을 촉진하는 오픈 소스 소프트웨어 인 다음 프로젝트의 저자에게 경의를 표하고 싶습니다.