El paquete de procesamiento de lenguaje natural de AHA integra HANLP , Word2Vec , Tools de pareja y otros proyectos, proporcionando servicios de procesamiento de lenguaje natural chino de alta calidad.
Las funciones actuales proporcionadas por AHANLP son:
La última versión de ahanlp.jar y el paquete de datos básico correspondiente ahanlp_base , haga clic aquí para descargar. Los archivos de configuración Ahanlp.Properties y Hanlp.Properties se ponen en classpath. Para la mayoría de los proyectos, solo necesita ponerlos en el directorio SRC. El IDE los copiará automáticamente en el ClassPath durante la compilación.
AHANLP sigue la estructura, el código y la separación de datos de la organización de datos de HANLP. Los usuarios pueden elegir los paquetes de datos correspondientes para descargar de acuerdo con sus necesidades:
dictionary y el directorio model se almacenan en los data/ directorio del proyecto.data/model/ directorio del proyecto.python -m pip install xxx.whl después de la descarga). Luego descargue Word_cloud (extraiga el código 9JB6) y coloque la carpeta extraída word_cloud en el directorio root del proyecto.Todos los parámetros en el proyecto AHANLP se leen desde el archivo de configuración (no se recomienda la modificación del usuario), y la siguiente es una breve descripción.
El archivo de configuración principal es ahanlp.properties , y la ruta del modelo Word2VEC debe configurarse, y el valor predeterminado es
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
El archivo de configuración de HANLP es hanlp.properties . Solo necesita establecer la ruta donde se encuentra el directorio de datos en la primera línea. El valor predeterminado es
root=./
Nota: El módulo de etiquetado de rol semántico tiene una huella de memoria alta. Si desea usar esta función, establezca la huella de memoria máxima del JVM a 4GB.
Casi todas las funciones de AHANLP se pueden llamar rápidamente a través de la clase de herramientas AHANLP . También se recomienda que los usuarios siempre llamen a la clase de herramientas AHANLP, de modo que después de que AHANLP se actualice en el futuro, los usuarios no necesitan modificar el código de llamadas.
Todas las demostraciones se encuentran bajo prueba. Demo, que cubre más detalles que el documento de introducción a continuación. Se recomienda ejecutarlo una vez, y también puede consultarlo:
Documentación de la interfaz 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]El segmento estándar encapsula el modelo HMM-Bigram y utiliza el método de circuito más corto para dividir la palabra (la solución de circuito más corto utiliza el algoritmo Viterbi), teniendo en cuenta tanto la eficiencia como el efecto. El participio de NLP (NLPSegment) encapsula el modelo Perceptron, respaldado por el marco de etiquetado de secuencia Perceptron estructurado, y realiza el reconocimiento de la entidad de anotación de forma de voz y el reconocimiento de la entidad de nombres al mismo tiempo, con mayor precisión y adecuada para su uso en el entorno de producción.
El resultado de retorno predeterminado del participio de Word contiene palabra y parte del discurso. Puede obtener la palabra o parte de la lista de discursos por AHANLP.getWordList(stdSegResult) y AHANLP.getNatureList(stdSegResult) respectivamente. Para la anotación de parte del discurso, consulte la "Colección de anotaciones de parte de voz de HANLP".
Si necesita personalizar el filtrado de parte del voz, puede usar la clase me.xiaosheng.chnlp.seg.POSFilter , que también implementa métodos comunes como filtrar puntuación y retener palabras reales.
// 过滤标点
POSFilter . removePunc ( stdSegResult );
// 保留名词
POSFilter . selectPOS ( stdSegResult , Arrays . asList ( "n" , "ns" , "nr" , "nt" , "nz" ));El participio de la palabra anterior admite el filtrado de las palabras de parada, solo traiga el segundo parámetro y configúrelo en verdadero.
List < Term > stdSegResult = AHANLP . NLPSegment ( content , true );
List < String > stdWordList = AHANLP . getWordList ( stdSegResult );
System . out . println ( stdWordList );
//[苏州大学, 周国栋, 教授, 正在, 教授, 自然语言处理, 课程] La segmentación de Word admite el diccionario definido por el usuario. HANLP utiliza la clase CustomDictionary para representarla. Es un diccionario global definido por el usuario que afecta a todas las máquinas de vocabulario. La ruta de texto del diccionario es data/dictionary/custom/CustomDictionary.txt , donde los usuarios pueden agregar sus propias palabras (no recomendadas). También puede crear un nuevo archivo de texto por separado y agregar el diccionario a través del archivo de configuración CustomDictionaryPath=data/dictionary/custom/CustomDictionary.txt; 我的词典.txt; (recomendado).
Formato de diccionario:
[单词] [词性A] [A的频次] [词性B] [B的频次] ... Si parte del discurso no se escribe, significa que la parte predeterminada del discurso se adopta en el diccionario.全国地名大全.txt ns; Si el espacio seguido por la parte del discurso es seguido inmediatamente por la parte del discurso, el diccionario predetermina la parte del discurso.** Nota: ** El programa lee el diccionario de los archivos de caché (filename.txt.bin o filename.txt.trie.dat y filename.txt.trie.value) de forma predeterminada. Si modifica cualquier diccionario, solo la eliminación del caché entrará en vigencia.
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 )));Las palabras de partición por oraciones en texto largo también son de uso común, y devuelve una lista de resultados compuestos por todas las oraciones del participio de palabras. El tipo de segmento de palabras se controla a través del primer parámetro Segtype: "estándar" corresponde al segmento de palabras estándar, y "NLP" corresponde al participio de NLP.
Por supuesto, también puede romper las oraciones manualmente y luego dividirlas en múltiples oraciones.
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] Los modelos Perceptron y CRF están encapsulados, respaldados por el marco de etiquetado de secuencia de perceptrones estructurado, y se identifican el tiempo, el nombre del lugar, el nombre de la persona y el nombre de la organización en el texto: nombre de persona per , nombre de lugar loc , nombre de organización org y 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 );
// [北京, 是, 首都] El análisis de sintaxis de dependencia es una encapsulación de NeuralNetworkDependEndipser en HANLP, utilizando un analizador de sintaxis de dependencia de alto rendimiento basado en redes neuronales. Los resultados del análisis están en formato de conll, y puede iterar de acuerdo con el tipo de conlword. Como se muestra arriba, CoNLLWord.LEMMA es una palabra esclava, CoNLLWord.HEAD.LEMMA es la palabra dominante y CoNLLWord.DEPREL es la etiqueta dependiente y predeterminada a la etiqueta china.
Si necesita usar una etiqueta en inglés, simplemente traiga el segundo parámetro y configúrelo en verdad
CoNLLSentence enDeps = AHANLP.DependencyParse(sentence, true);
Para obtener descripciones detalladas de las etiquetas de dependencia, consulte "Etiquetas de dependencia".
String document = "我国第二艘航空母舰下水仪式26日上午在中国船舶重工集团公司大连造船厂举行。航空母舰在拖曳牵引下缓缓移出船坞,停靠码头。目前,航空母舰主船体完成建造,动力、电力等主要系统设备安装到位。" ;
List < String > wordList = AHANLP . extractKeyword ( document , 5 );
System . out . println ( wordList );
//[航空母舰, 动力, 建造, 牵引, 完成]La función ExtractKeyword establece el número de palabras clave devueltas a través del segundo parámetro. El valor de rango de cada palabra se calcula internamente a través del algoritmo TexTrank, y lo organiza en orden descendente del valor de rango, extrayendo las pocas anteriores como palabras clave. Para principios específicos, consulte "Palabras clave y resúmenes de extracción de extracción de algoritmo 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日上午在中国船舶重工集团公司大连造船厂举行。航空母舰主船体完成建造。
*/La función ExtractKeysentence es responsable de extraer oraciones clave, y el segundo parámetro controla el número de oraciones clave extraídas. La función ExtractSummary es responsable del resumen automático, y el segundo parámetro establece el límite superior del recuento de palabras resumidos. El valor de rango de cada oración se calcula internamente a través del algoritmo TexTrank, y lo organiza en orden descendente del valor de rango, extrayendo las pocas anteriores como oraciones clave. El resumen automático es similar y también considera la posición de la oración en el texto original y la longitud de la oración. Para principios específicos, consulte "Palabras clave y resúmenes de extracción de extracción de algoritmo TexTrank".
El grado de similitud entre las oraciones (es decir, los pesos en el algoritmo de Textrank) se calcula utilizando las funciones proporcionadas por Word2Vec. El modelo entrenado en el corpus chino de Wikipedia se usa de forma predeterminada, y también se puede utilizar un modelo personalizado.
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
*/ Laimilitud de las palabras y las oraciones La similitud son funciones que calculan la similitud de las palabras y las oraciones, respectivamente. El proceso de cálculo utiliza los vectores de palabras previamente entrenados por el modelo Word2Vec. Antes de usar, debe descargar el modelo Word2Vec y luego almacenar el archivo de modelo descomprimido en los data/model/ directorio del proyecto. La similitud de palabras se calcula directamente calculando el valor de coseno de Vector Word. Puede consultar Word2Vec/Tusss1 para obtener la forma de obtener similitud de oraciones. Si desea entrenar el modelo Word2Vec usted mismo, puede consultar la versión de entrenamiento de Google del modelo.
Nota: Las oracionesimility utiliza la segmentación de palabras estándar para segmentar oraciones de forma predeterminada y filtra las palabras de detención.
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]
*/ El componente SRL en las herramientas de pareja (incluido el reconocimiento de parte de la voz y el analizador de sintaxis dependiente) puede identificar el predicate en el texto y los argumentos correspondientes: Agente A0 , destinatario A1 , TIME TMP y Ubicación LOC . Se agregó soporte para texto largo SRLPARSECONTENT (contenido) y compensaciones de texto coincidentes, que se pueden colocar a través de la posición y las compensaciones de predicados y argumentos en el texto.
NOTA: Cada predicado corresponde a más de un argumento en una determinada categoría, por ejemplo, el predicado "ataque" puede corresponder con los activadores múltiples A0 (atacante).
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 );Predicción de temas de LDA De manera predeterminada, el modelo LDA de noticias se usa para predecir temas, y el número de tema con la máxima probabilidad es la salida. El modelo predeterminado está capacitado a partir de 1,000 noticias (tal vez insatisfechas) de cada categoría en Sogou News Corpus (SoGoucs), con un total de 100 temas.
Los usuarios también pueden entrenar el modelo LDA por sí mismos a través de ZHNLP.trainLDAModel() . Después del entrenamiento, pueden usar el método topicInference sobrecargado para cargarlo.
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 ); Si necesita ejecutar ldademo.java para las pruebas, también debe descargar Sogouca_Mini y almacenar la mini carpeta extraída en los data/ directorio del proyecto.
String tc = AHANLP . convertSC2TC ( "用笔记本电脑写程序" );
System . out . println ( tc );
String sc = AHANLP . convertTC2SC ( "「以後等妳當上皇后,就能買士多啤梨慶祝了」" );
System . out . println ( sc );
/*
用筆記本電腦寫程序
“以后等你当上皇后,就能买草莓庆祝了”
*/ La conversión china simple y tradicional es un envoltorio para convertToTraditionalChinese los métodos convertToSimplifiedChinese en HANLP. Puede identificar palabras que se dividen entre chino simple y tradicional, como打印机=印表機; y muchos personajes que no pueden distinguirse por herramientas de conversión china simples y tradicionales, como las dos "年" en "年" y "reina".
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 usa una lista de Word para crear un objeto de WordCloud, luego llama createImage para crear una imagen en la nube de Word y pasa la dirección guardada de la imagen como parámetro. La palabra nube dibuja el tamaño de cada palabra de acuerdo con la frecuencia de la palabra. Cuanto mayor sea la frecuencia de la palabra, mayor es la palabra; El color y la posición se generan al azar.

El tamaño de imagen generado predeterminado es 500x400 y el color de fondo es blanco. También puede personalizar el color de fondo y el tamaño de la imagen de la imagen.
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, 黑色背景Me gustaría rendir homenaje a los autores de los siguientes proyectos, que son estos software de código abierto que promueven la popularización y aplicación de la tecnología de procesamiento del lenguaje natural.