Le package de traitement du langage naturel AHA intègre HANLP , Word2Vec , Mate-Tools et d'autres projets, offrant des services de traitement chinois de haute qualité en langage naturel.
Les fonctions actuelles fournies par AHANLP sont:
La dernière version d' Ahanlp.jar et le paquet de données de base correspondant ahanlp_base , cliquez ici pour télécharger. Les fichiers de configuration ahanlp.properties et hanlp.properties sont placés dans le chemin de classe. Pour la plupart des projets, il vous suffit de les mettre dans le répertoire SRC. L'IDE les copiera automatiquement sur le chemin de classe pendant la compilation.
AHANLP suit la structure de l'organisation de données de HANLP, la séparation du code et des données. Les utilisateurs peuvent choisir les paquets de données correspondants à télécharger en fonction de leurs besoins:
dictionary et le répertoire model sont stockés dans les data/ répertoires du projet.data/model/ répertoire du projet.python -m pip install xxx.whl après téléchargement). Téléchargez ensuite Word_Cloud (Extracter Code 9JB6) et placez le dossier word_cloud extrait dans le répertoire racine du projet.Tous les paramètres du projet AHANLP sont lus à partir du fichier de configuration (la modification de l'utilisateur n'est pas recommandée), et ce qui suit est une brève description.
Le fichier de configuration principal est ahanlp.properties , et le chemin du modèle Word2Vec doit être configuré, et la valeur par défaut est
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
Le fichier de configuration HANLP est hanlp.properties . Il vous suffit de définir le chemin où le répertoire de données est situé sur la première ligne. La valeur par défaut est
root=./
Remarque: Le module d'étiquetage des rôles sémantique a une empreinte de mémoire élevée. Si vous souhaitez utiliser cette fonctionnalité, veuillez définir l'empreinte de mémoire maximale du JVM sur 4 Go.
Presque toutes les fonctions d' AHANLP peuvent être appelées rapidement via la classe d'outils AHANLP . Il est également recommandé que les utilisateurs appellent toujours via la classe d'outils AHANLP, de sorte qu'après la mise à niveau AHANLP à l'avenir, les utilisateurs n'ont pas besoin de modifier le code d'appel.
Toutes les démos sont situées sous Test.demo, couvrant plus de détails que le document d'introduction ci-dessous. Il est fortement recommandé de l'exécuter une fois, et vous pouvez également le vérifier:
Documentation de l'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]Le segment standard encapsule le modèle HMM-bigram et utilise la méthode le plus court pour diviser le mot (la solution de circuit le plus court utilise l'algorithme ViterBI), en tenant compte à la fois de l'efficacité et de l'effet. Le participe NLP (NLPSegment) encapsule le modèle Perceptron, soutenu par le cadre de marquage de séquence perceptron structuré, et effectue une part de l'annotation et de la reconnaissance des entités de dénomination en même temps, avec une plus grande précision et adaptée à une utilisation dans l'environnement de production.
Le résultat de retour par défaut du participe Word contient un mot et une partie de la parole. Vous pouvez obtenir le mot ou une partie de la liste des discours par AHANLP.getWordList(stdSegResult) et AHANLP.getNatureList(stdSegResult) respectivement. Pour une annotation de dispositive, veuillez vous référer à la "collection d'annotation HanLP".
Si vous avez besoin de personnaliser le filtrage d'une partie du discours, vous pouvez utiliser la classe me.xiaosheng.chnlp.seg.POSFilter , qui met également en œuvre des méthodes communes telles que le filtrage de ponctuation et le maintien de vrais mots.
// 过滤标点
POSFilter . removePunc ( stdSegResult );
// 保留名词
POSFilter . selectPOS ( stdSegResult , Arrays . asList ( "n" , "ns" , "nr" , "nt" , "nz" ));Le mot participe ci-dessus prend en charge le filtrage des mots d'arrêt, apportez simplement le deuxième paramètre et le définissez sur true.
List < Term > stdSegResult = AHANLP . NLPSegment ( content , true );
List < String > stdWordList = AHANLP . getWordList ( stdSegResult );
System . out . println ( stdWordList );
//[苏州大学, 周国栋, 教授, 正在, 教授, 自然语言处理, 课程] La segmentation des mots prend en charge le dictionnaire défini par l'utilisateur. HANLP utilise la classe CustomDictionary pour le représenter. Il s'agit d'un dictionnaire mondial défini par l'utilisateur qui affecte toutes les machines de vocabulaire. Le chemin de texte du dictionnaire est data/dictionary/custom/CustomDictionary.txt , où les utilisateurs peuvent ajouter leurs propres mots (non recommandés). Vous pouvez également créer un nouveau fichier texte séparément et ajouter le dictionnaire via le fichier de configuration CustomDictionaryPath=data/dictionary/custom/CustomDictionary.txt; 我的词典.txt; (recommandé).
Format de dictionnaire:
[单词] [词性A] [A的频次] [词性B] [B的频次] ... si une partie de la parole n'est pas écrite, cela signifie que la partie par défaut de la parole est adoptée dans le dictionnaire.全国地名大全.txt ns; Si l'espace suivi par la partie du discours est immédiatement suivi de la partie du discours, le dictionnaire par défaut la partie du discours.** Remarque: ** Le programme lit le dictionnaire à partir de fichiers de cache (filename.txt.bin ou filename.txt.trie.dat et filename.txt.trie.value) par défaut. Si vous modifiez un dictionnaire, la suppression du cache ne prendra effet.
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 )));Le partitionnement des mots par phrases sur le texte long est également une utilisation courante, et renvoie une liste de résultats composés de toutes les phrases de participe des mots. Le type de segmentateur de mots est contrôlé par le premier paramètre SEGTYPE: "Standard" correspond au segment de mots standard, et "NLP" correspond au participe NLP.
Bien sûr, vous pouvez également casser manuellement les phrases et les diviser en plusieurs phrases.
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] Les modèles Perceptron et CRF sont encapsulés, soutenus par le cadre d'étiquetage structuré de la séquence Perceptron, et le nom, le nom de la personne, le nom de la personne et le nom de l'organisation dans le texte sont identifiés: nom de la personne per , nom de lieu loc , nom d'organisation org et 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 );
// [北京, 是, 首都] L'analyse de syntaxe de dépendance est une encapsulation de neuralnetworkDenpendenCyParser dans HANLP, en utilisant un analyseur de syntaxe de dépendance haute performance basé sur des réseaux de neurones. Les résultats de l'analyse sont au format Conll, et vous pouvez itérer en fonction du type conllword. Comme indiqué ci-dessus, CoNLLWord.LEMMA est un mot esclave, CoNLLWord.HEAD.LEMMA est le mot dominant, et CoNLLWord.DEPREL est l'étiquette dépendante et par défaut l'étiquette chinoise.
Si vous devez utiliser une étiquette anglaise, apportez simplement le deuxième paramètre et définissez-le sur true
CoNLLSentence enDeps = AHANLP.DependencyParse(sentence, true);
Pour des descriptions détaillées des balises de dépendance, veuillez vous référer aux "balises de dépendance".
String document = "我国第二艘航空母舰下水仪式26日上午在中国船舶重工集团公司大连造船厂举行。航空母舰在拖曳牵引下缓缓移出船坞,停靠码头。目前,航空母舰主船体完成建造,动力、电力等主要系统设备安装到位。" ;
List < String > wordList = AHANLP . extractKeyword ( document , 5 );
System . out . println ( wordList );
//[航空母舰, 动力, 建造, 牵引, 完成]La fonction ExtractKeyword définit le nombre de mots clés renvoyés via le deuxième paramètre. La valeur de classement de chaque mot est calculée en interne à travers l'algorithme Textrank et l'a organisée par ordre décroissant de la valeur de rang, extraite les quelques précédents mots clés. Pour des principes spécifiques, veuillez vous référer à "Textrank Algorithme Extraction Mots-clés et résumés".
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 fonction ExtractKeySentence est responsable de l'extraction de phrases de clés et le deuxième paramètre contrôle le nombre de phrases de clés extraites. La fonction d'extractsUmmary est responsable du résumé automatique et le deuxième paramètre définit la limite supérieure du nombre de mots de résumé. La valeur de classement de chaque phrase est calculée en interne à travers l'algorithme Textrank et l'a organisée par ordre décroissant de la valeur de rang, extrait les quelques précédentes en tant que phrases clés. Le résumé automatique est similaire et considère également la position de la phrase dans le texte d'origine et la durée de la phrase. Pour des principes spécifiques, veuillez vous référer à "Textrank Algorithme Extraction Mots-clés et résumés".
Le degré de similitude entre les phrases (c'est-à-dire les poids dans l'algorithme Textrank) est calculé en utilisant les fonctions fournies par Word2Vec. Le modèle formé au corpus chinois de Wikipedia est utilisé par défaut, et un modèle personnalisé peut également être utilisé.
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
*/ Les mots-similitude et les phrases similaires sont des fonctions qui calculent respectivement la similitude des mots et des phrases. Le processus de calcul utilise le mot vecteurs pré-formé par le modèle Word2Vec. Avant d'utiliser, vous devez télécharger le modèle Word2Vec, puis stocker le fichier de modèle décompressé dans les data/model/ répertoires du projet. La similitude des mots est directement calculée en calculant la valeur de cosinus du vecteur mot. Vous pouvez vous référer à Word2Vec / Issues1 pour la façon d'obtenir la similitude des phrases. Si vous souhaitez former vous-même le modèle Word2Vec, vous pouvez vous référer à la formation Google de la version du modèle.
Remarque: Sentences Inimilarity utilise la segmentation des mots standard pour segmenter les phrases par défaut et filtre les mots d'arrêt.
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]
*/ Le composant SRL dans les outils de mate (y compris la reconnaissance de la partie du discours et l'analyseur de syntaxe dépendante) peut identifier le predicate dans le texte et les arguments correspondants: agent A0 , destinataire A1 , temps TMP et localisation LOC . Ajout de la prise en charge de SrlParsEcontent (Contenu) et de contenu correspondant et correspondant, qui peuvent être positionnés via la position et les décalages des prédicats et des arguments dans le texte.
Remarque: Chaque prédicat correspond à plus d'un argument dans une certaine catégorie, par exemple, le prédicat "Attack" peut correspondre à plusieurs activateurs A0 (attaquant).
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 );Prédiction du sujet LDA Par défaut, le modèle LDA News est utilisé pour prédire les sujets, et le numéro de sujet avec la probabilité maximale est la sortie. Le modèle par défaut est formé à partir de 1 000 nouvelles (peut-être insatisfaites) de chaque catégorie de Sogou News Corpus (SOGOUCS), avec un total de 100 sujets.
Les utilisateurs peuvent également former le modèle LDA par eux-mêmes via ZHNLP.trainLDAModel() . Après la formation, ils peuvent utiliser la méthode topicInference surchargée pour le charger.
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 vous devez exécuter ldademo.java pour les tests, vous devez également télécharger SOGOUCA_MINI et stocker le mini dossier extrait dans les data/ répertoires du projet.
String tc = AHANLP . convertSC2TC ( "用笔记本电脑写程序" );
System . out . println ( tc );
String sc = AHANLP . convertTC2SC ( "「以後等妳當上皇后,就能買士多啤梨慶祝了」" );
System . out . println ( sc );
/*
用筆記本電腦寫程序
“以后等你当上皇后,就能买草莓庆祝了”
*/ La conversion chinoise simple et traditionnelle est un emballage pour convertToTraditionalChinese et convertToSimplifiedChinese dans le HANLP. Il peut identifier les mots divisés entre les chinois simples et traditionnels, comme打印机=印表機; et de nombreux personnages qui ne peuvent pas être distingués par des outils de conversion chinois simples et traditionnels, tels que les deux "年" dans "年" et "reine".
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 utilise une liste de mots pour créer un objet WordCloud, puis appelle createImage pour créer une image de cloud Word et transmet l'adresse enregistrée de l'image en tant que paramètre. Le nuage de mots tire la taille de chaque mot en fonction de la fréquence des mots. Plus la fréquence du mot est élevée, plus le mot est grand; La couleur et la position sont générées au hasard.

La taille de l'image générée par défaut est de 500x400 et la couleur d'arrière-plan est blanche. Vous pouvez également personnaliser la couleur d'arrière-plan et la taille de l'image de l'image
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, 黑色背景Je voudrais rendre hommage aux auteurs des projets suivants, qui sont ces logiciels open source qui favorisent la popularisation et l'application de la technologie de traitement du langage naturel.