O pacote de processamento de linguagem natural da AHA integra Hanlp , Word2Vec , Mate-Tools e outros projetos, fornecendo serviços de processamento de linguagem natural chinesa de alta qualidade.
As funções atuais fornecidas pela AhanLP são:
A versão mais recente do ahanlp.jar e o pacote de dados básico correspondente Ahanlp_base , clique aqui para baixar. Os arquivos de configuração ahanlp.properties e hanlp.properties são colocados no ClassPath. Para a maioria dos projetos, você só precisa colocá -los no diretório SRC. O IDE os copiará automaticamente para o caminho de classe durante a compilação.
O AHANLP segue a estrutura da organização de dados da HANLP, a separação de código e dados. Os usuários podem escolher pacotes de dados correspondentes para baixar de acordo com suas necessidades:
dictionary e o diretório model são armazenados no data/ diretório do projeto.data/model/ Diretório do Projeto.python -m pip install xxx.whl após o download). Em seguida, faça o download word_cloud (Extrair código 9jb6) e coloque a pasta word_cloud extraída no diretório raiz do projeto.Todos os parâmetros no projeto AHANLP são lidos no arquivo de configuração (a modificação do usuário não é recomendada) e a seguir é uma breve descrição.
O arquivo de configuração principal é ahanlp.properties , e o caminho do modelo Word2vec precisa ser configurado, e o padrão é
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
O arquivo de configuração HANLP é hanlp.properties . Você só precisa definir o caminho em que o diretório de dados está localizado na primeira linha. O padrão é
root=./
NOTA: O módulo de rotulagem semântica de função tem uma pegada de alta memória. Se você deseja usar esse recurso, defina a pegada máxima de memória da JVM como 4 GB.
Quase todas as funções do AHANLP podem ser chamadas rapidamente através da classe de ferramentas AHANLP . Também é recomendável que os usuários sempre liguem através da classe de ferramentas AHANLP, para que, depois que o AHANLP for atualizado no futuro, os usuários não precisam modificar o código de chamada.
Todas as demos estão localizadas em teste.demo, cobrindo mais detalhes do que o documento de introdução abaixo. É altamente recomendável executá -lo uma vez e você também pode conferir:
Documentação da interface 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]O segmento padrão encapsula o modelo HMM-Bigram e usa o método de circuito mais curto para dividir a palavra (a solução de circuito mais curto usa o algoritmo Viterbi), levando em consideração a eficiência e o efeito. O particípio de PNL (NLPSEGment) encapsula o modelo perceptron, suportado pela estrutura de marcação de sequência de perceptron estruturada, e realiza anotação de parte da fala e reconhecimento de entidades de nomeação ao mesmo tempo, com maior precisão e adequado para uso no ambiente de produção.
O resultado padrão de retorno do particípio do Word contém palavras e parte do discurso. Você pode obter a palavra ou parte da lista de discursos por AHANLP.getWordList(stdSegResult) e AHANLP.getNatureList(stdSegResult) respectivamente. Para anotação de parte da fala, consulte a "Coleção de anotação de parte da fala HANLP".
Se você precisar personalizar a filtragem de parte da fala, poderá usar a classe me.xiaosheng.chnlp.seg.POSFilter , que também implementa métodos comuns, como filtragem de pontuação e retenção de palavras reais.
// 过滤标点
POSFilter . removePunc ( stdSegResult );
// 保留名词
POSFilter . selectPOS ( stdSegResult , Arrays . asList ( "n" , "ns" , "nr" , "nt" , "nz" ));A palavra particípio acima suporta filtragem de palavras de parada, basta trazer o segundo parâmetro e defini -lo como true.
List < Term > stdSegResult = AHANLP . NLPSegment ( content , true );
List < String > stdWordList = AHANLP . getWordList ( stdSegResult );
System . out . println ( stdWordList );
//[苏州大学, 周国栋, 教授, 正在, 教授, 自然语言处理, 课程] A segmentação de palavras suporta dicionário definido pelo usuário. O HANLP usa a classe CustomDictionary para representá -la. É um dicionário global definido pelo usuário que afeta todas as máquinas de vocabulário. O caminho de texto do dicionário é data/dictionary/custom/CustomDictionary.txt , onde os usuários podem adicionar suas próprias palavras (não recomendadas). Você também pode criar um novo arquivo de texto separadamente e anexar o dicionário através do arquivo de configuração CustomDictionaryPath=data/dictionary/custom/CustomDictionary.txt; 我的词典.txt; (recomendado).
Formato de dicionário:
[单词] [词性A] [A的频次] [词性B] [B的频次] ... Se parte da fala não for escrita, significa que a parte padrão da fala é adotada no dicionário.全国地名大全.txt ns; Se o espaço seguido pela parte do discurso for imediatamente seguido pela parte da fala, o dicionário padrão é a parte da fala.** NOTA: ** O programa lê o dicionário de arquivos de cache (filename.txt.bin ou filename.txt.trie.dat e filename.txt.trie.value) por padrão. Se você modificar qualquer dicionário, excluir apenas o cache entrará em vigor.
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 )));Particionando palavras por frases em texto longo também é um uso comum e retorna uma lista de resultados compostos por todas as frases de particípio do Word. O tipo de segmento de palavras é controlado através do primeiro parâmetro SEGTYPE: "padrão" corresponde ao segmento de palavras padrão e "NLP" corresponde ao particípio da PNL.
Obviamente, você também pode quebrar manualmente as frases e dividi -las em várias frases.
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] Os modelos Perceptron e CRF são encapsulados, suportados pela estrutura de rotulagem de sequência de perceptron estruturada, e o tempo, o nome do local, o nome da pessoa e o nome da organização no texto são identificados: Nome da pessoa per , Nome do local loc , nome da organização org e 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 );
// [北京, 是, 首都] A análise de sintaxe de dependência é um encapsulamento do NeuralNetworkDependencyParser no HANLP, usando um analisador de sintaxe de dependência de alto desempenho baseado em redes neurais. Os resultados da análise estão em formato Conll e você pode iterar de acordo com o tipo Conllword. Como mostrado acima, CoNLLWord.LEMMA é uma palavra escrava, CoNLLWord.HEAD.LEMMA é a palavra dominante e CoNLLWord.DEPREL é o rótulo dependente e os padrões do rótulo chinês.
Se você precisar usar um rótulo em inglês, basta trazer o segundo parâmetro e defini -lo como true
CoNLLSentence enDeps = AHANLP.DependencyParse(sentence, true);
Para descrições detalhadas das tags de dependência, consulte "Tags de dependência".
String document = "我国第二艘航空母舰下水仪式26日上午在中国船舶重工集团公司大连造船厂举行。航空母舰在拖曳牵引下缓缓移出船坞,停靠码头。目前,航空母舰主船体完成建造,动力、电力等主要系统设备安装到位。" ;
List < String > wordList = AHANLP . extractKeyword ( document , 5 );
System . out . println ( wordList );
//[航空母舰, 动力, 建造, 牵引, 完成]A função ExtractKeyword define o número de palavras -chave retornadas através do segundo parâmetro. O valor de classificação de cada palavra é calculado internamente através do algoritmo TexTrank e o organizou em ordem decrescente do valor de classificação, extraindo as poucas palavras -chave anteriores. Para princípios específicos, consulte "TexTrank Algorithm Extração Palavras -chave e resumos".
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日上午在中国船舶重工集团公司大连造船厂举行。航空母舰主船体完成建造。
*/A função de extractkeysentence é responsável pela extração de frases -chave e o segundo parâmetro controla o número de frases -chave extraídas. A função extractSummary é responsável pelo resumo automático e o segundo parâmetro define o limite superior da contagem de palavras de resumo. O valor de classificação de cada frase é calculado internamente através do algoritmo TexTrank e o organizou em ordem decrescente do valor de classificação, extraindo os poucos anteriores como frases -chave. O resumo automático é semelhante e também considera a posição da frase no texto original e o comprimento da frase. Para princípios específicos, consulte "TexTrank Algorithm Extração Palavras -chave e resumos".
O grau de similaridade entre as frases (ou seja, os pesos no algoritmo TexTrank) é calculado usando as funções fornecidas pelo Word2Vec. O modelo treinado no corpus chinês da Wikipedia é usado por padrão, e um modelo personalizado também pode ser usado.
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
*/ Wordsimilaridade e sentenças são funções que calculam a semelhança de palavras e frases, respectivamente. O processo de cálculo usa os vetores de palavras pré-treinados pelo modelo Word2vec. Antes de usar, você precisa baixar o modelo Word2vec e armazenar o arquivo de modelo descompactado no diretório data/model/ do projeto. A similaridade das palavras é calculada diretamente calculando o valor do cosseno do vetor de palavra. Você pode consultar o Word2Vec/Issues1 para obter a maneira de obter similaridade da frase. Se você deseja treinar o modelo Word2Vec, pode consultar o treinamento da versão do Google do modelo.
NOTA: O Sinencesimilaridade usa a segmentação de palavras padrão para segmentar frases por padrão e filtra as palavras de parada.
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]
*/ O componente SRL nas ferramentas mate (incluindo o reconhecedor de parte da fala e o analisador de sintaxe dependente) pode identificar o predicate no texto e os argumentos correspondentes: agente A0 , destinatário A1 , TEMP TMP e localização LOC . Adicionado suporte para texto longo srlparseContent (conteúdo) e compensações de texto correspondentes, que podem ser posicionadas através da posição e compensações de predicados e argumentos no texto.
Nota: Cada predicado corresponde a mais de um argumento em uma determinada categoria, por exemplo, o predicado "ataque" pode corresponder a vários ativadores A0 (invasor).
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 );Por padrão, a previsão de tópicos da LDA, o modelo LDA do News é usado para prever tópicos, e o número do tópico com a máxima probabilidade é emitido. O modelo padrão é treinado a partir de 1.000 notícias (talvez insatisfeitas) de cada categoria no Sogou News Corpus (SOGOUCS), com um total de 100 tópicos.
Os usuários também podem treinar o modelo LDA por si mesmos através ZHNLP.trainLDAModel() . Após o treinamento, eles podem usar o método topicInference sobrecarregado para carregá -lo.
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 ); Se você precisar executar o ldademo.java para teste, também precisará baixar o SOGOUCA_MINI e armazenar a mini pasta extraída no data/ diretório do projeto.
String tc = AHANLP . convertSC2TC ( "用笔记本电脑写程序" );
System . out . println ( tc );
String sc = AHANLP . convertTC2SC ( "「以後等妳當上皇后,就能買士多啤梨慶祝了」" );
System . out . println ( sc );
/*
用筆記本電腦寫程序
“以后等你当上皇后,就能买草莓庆祝了”
*/ A conversão chinesa simples e tradicional é um invólucro para convertToTraditionalChinese e convertToSimplifiedChinese no HANLP. Ele pode identificar palavras divididas entre chinês simples e tradicional, como打印机=印表機; E muitos personagens que não podem ser distinguidos por ferramentas de conversão simples e tradicionais chinesas, como os dois "年" em "年" e "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 ();
} O WordCloud usa uma lista de palavras para criar um objeto WordCloud e, em seguida, chama createImage para criar uma imagem em nuvem do Word e passa o endereço salvo da imagem como um parâmetro. A palavra nuvem desenha o tamanho de cada palavra de acordo com a frequência da palavra. Quanto maior a palavra frequência, maior a palavra; A cor e a posição são geradas aleatoriamente.

O tamanho da imagem gerado padrão é 500x400 e a cor do fundo é branca. Você também pode personalizar a cor de fundo e o tamanho da imagem da imagem
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, 黑色背景Gostaria de prestar homenagem aos autores dos seguintes projetos, que são esses softwares de código aberto que promovem a popularização e a aplicação da tecnologia de processamento de linguagem natural.