stanford corenlp的TokensRegex

最近做一些音樂類、讀物類的自然語言理解,就調研使用了下Stanford corenlp,記錄下來。

功能

Stanford Corenlp是一套自然語言分析工具集包括:

  • POS(part of speech tagger)-標注詞性
  • NER(named entity recognizer)-實體名識別
  • Parser樹-分析句子的語法結構,如識別出短語詞組、主謂賓等
  • Coreference Resolution-指代消解,找出句子中代表同一個實體的詞。下文的I/my,Nader/he表示的是同一個人

  

  • Sentiment Analysis-情感分析
  • Bootstrapped pattern learning-自展的模式學習(也不知道翻譯對不對,大概就是可以無監督的提取一些模式,如提取實體名)
  • Open IE(Information Extraction)-從純文本中提取有結構關系組,如"Barack Obama was born in Hawaii" =》?(Barack Obama; was born in; Hawaii)

需求

語音交互類的應用(如語音助手、智能音箱echo)收到的通常是口語化的自然語言,如:我想聽一個段子,給我來個牛郎織女的故事,要想精確的返回結果,就需要提出有用的主題詞,段子/牛郎織女/故事。看了一圈就想使用下corenlp的TokensRegex,基于tokens序列的正則表達式。因為它提供的可用的工具有:正則表達式、分詞、詞性、實體類別,另外還可以自己指定實體類別,如指定牛郎織女是READ類別的實體。

Pattern語法

規則格式

{// ruleType is "text", "tokens", "composite", or "filter"ruleType: "tokens",//tokens是基于切詞用于tokens正則,text是文本串用于文本正則,composite/filter還沒搞明白// pattern to be matched  pattern: ( ( [ { ner:PERSON } ]) /was/ /born/ /on/ ([ { ner:DATE } ]) ),// value associated with the expression for which the pattern was matched// matched expressions are returned with "DATE_OF_BIRTH" as the value// (as part of the MatchedExpression class)result: "DATE_OF_BIRTH"
}

除了上面的字段外還有action/name/stage/active/priority等,可以參考文后的文獻。

ruleTypes是tokens,pattern中的基本元素是token,整體用(),1個token用[<expression>],1個expression用{tag:xx;ner:xx}來表述

ruleTypes是text,pattern就是常規的正則表達式,基本元素就是字符了,整體用//包圍

實例

corenlp提供了單條/多條正則表達式的提取,本文就介紹從文件中加載規則來攔截我們需要的文本,并從中提取主題詞。

依賴包
<dependency><groupId>edu.stanford.nlp</groupId><artifactId>stanford-corenlp</artifactId><version>3.4.1</version>
</dependency>
<dependency><groupId>edu.stanford.nlp</groupId><artifactId>stanford-corenlp</artifactId><version>3.4.1</version><classifier>models</classifier>
</dependency>
<!--中文支持--> <dependency><groupId>edu.stanford.nlp</groupId><artifactId>stanford-corenlp</artifactId><version>3.6.0</version><classifier>models-chinese</classifier> </dependency>
屬性配置CoreNLP-chinese.properties(可以參考stanford-corenlp-models-chinese中的配置)
annotators = segment, ssplit, pos, ner, regexner, parse
regexner.mapping = regexner.txt//自定義的實體正則表達式文件customAnnotatorClass.segment = edu.stanford.nlp.pipeline.ChineseSegmenterAnnotatorsegment.model = edu/stanford/nlp/models/segmenter/chinese/pku.gz
segment.sighanCorporaDict = edu/stanford/nlp/models/segmenter/chinese
segment.serDictionary = edu/stanford/nlp/models/segmenter/chinese/dict-chris6.ser.gz
segment.sighanPostProcessing = truessplit.boundaryTokenRegex = [.]|[!?]+|[。]|[!?]+ //句子切分符pos.model = edu/stanford/nlp/models/pos-tagger/chinese-distsim/chinese-distsim.taggerner.model = edu/stanford/nlp/models/ner/chinese.misc.distsim.crf.ser.gz
ner.applyNumericClassifiers = false
ner.useSUTime = falseparse.model = edu/stanford/nlp/models/lexparser/chinesePCFG.ser.gz

corenlp中對文本的一次處理稱為一個pipeline,annotators代表一個處理節點,如segment切詞、ssplit句子切割(將一段話分為多個句子)、pos詞性、ner實體命名、regexner是用自定義正則表達式來標注實體類型、parse是句子結構解析。后面就是各annotator的屬性。

自定義的規則文件

regexner.txt(將'牛郎織女'的實體類別識別為READ)

牛郎織女	READ

rule.txt(tokensregex規則)

$TYPE="/笑話|故事|段子|口技|謎語|寓言|評書|相聲|小品|唐詩|古詩|宋詞|繞口令|故事|小說/ | /腦筋/ /急轉彎/"
//單類型
{ruleType: "tokens",pattern: ((?$type $TYPE)),result: Format("%s;%s;%s", "", $$type.text.replace(" ",""), "")
}

(?type xx)代表一個命名group,提取該group將結果組裝成xx;xx;xx形式返回

代碼
//加載tokens正則表達
CoreMapExpressionExtractor extractor = CoreMapExpressionExtractor.createExtractorFromFile(TokenSequencePattern.getNewEnv(), "rule.txt");
//創建pipeline
StanfordCoreNLP coreNLP = new StanfordCoreNLP("CoreNLP-chinese.properties");
//處理文本
Annotation annotation = coreNLP.process("聽個故事");
List<CoreMap> sentences = annotation.get(CoreAnnotations.SentencesAnnotation.class);
CoreMap sentence = sentences.get(0); //獲得第一個句子分析結果
//過一遍tokens正則
List<MatchedExpression> matchedExpressions = extractor.extractExpressions(sentence);
for (MatchedExpression match : matchedExpressions) {System.out.println("Matched expression: " + match.getText() + " with value " + match.getValue());
}

想看下分析結果,如切詞、詞性、實體名,可以使用下面的函數

    private void debug(CoreMap sentence) {// 從CoreMap中取出CoreLabel List,逐一打印出來List<CoreLabel> tokens = sentence.get(CoreAnnotations.TokensAnnotation.class);System.out.println("字/詞" + "\t " + "詞性" + "\t " + "實體標記");System.out.println("-----------------------------");for (CoreLabel token : tokens) {String word = token.getString(CoreAnnotations.TextAnnotation.class);String pos = token.getString(CoreAnnotations.PartOfSpeechAnnotation.class);String ner = token.getString(CoreAnnotations.NamedEntityTagAnnotation.class);System.out.println(word + "\t " + pos + "\t " + ner);}}

功能還是很強大的,畢竟可以用的東西多了,遇到問題時方法就多了。

參考文獻

TokensRegex:?http://nlp.stanford.edu/software/tokensregex.shtml

SequenceMatchRules:?http://nlp.stanford.edu/nlp/javadoc/javanlp-3.5.0/edu/stanford/nlp/ling/tokensregex/SequenceMatchRules.html

Regexner:?http://nlp.stanford.edu/software/regexner.html

轉載于:https://www.cnblogs.com/whuqin/p/5741706.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256663.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256663.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256663.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

將Linux系統下交叉編譯的依賴庫推到ARM平臺下無法建立以來關系解決

問題&#xff1a;平常把opencv庫使用源碼交叉編譯好之后&#xff0c;從windows推到飛機里發現&#xff0c;該庫的依賴關系都沒有了&#xff0c;導致程序運行的時候報該庫大小有問題 解決辦法&#xff1a; 1、將linux下的庫推到ARM平臺中的一個文件夾中&#xff0c;然后將ARM平臺…

Java:switch語句例子

1、輸入一個名次&#xff0c;第1&#xff5e;4名&#xff0c;分別稱為冠軍、亞軍、季軍、殿軍&#xff0c;5名及5名以上&#xff0c;稱為其他名次。 import java.util.Scanner; public class switch1 {public static void main(String[] args){Scanner snew Scanner(System.in)…

SQL計算100以內的質數(可以把100換成任意的整數)

declare i int --定義局部變量ideclare j int --定義局部變量jset i1 --給變量i賦值while i<100 --最外層while循環控制計算20以內的質數&#xff0c;每循環一次提供一個數&#xff0c;判斷它是不是質數begin --最外層while循環開始set j1 --給變量j賦…

matlab常用函數——數據類型函數

三、基本數據類型函數 1)數值函數 double:轉換為雙精度浮點數 single:轉換為單精度浮點數 typecast:在不改變數據大小情況下轉換數據類型 Y=typecast(X,type) type可選范圍:uint8、int8、uint16、int16、uint32、int32、uint64、int64、single、double arrayfun:把函數…

Courses hdu 1083(匹配)

http://acm.hdu.edu.cn/showproblem.php?pid1083 題意&#xff1a;一共有N個學生跟P門課程,一個學生可以任意選一門或多門課,問是否達成: 1.每個學生選的都是不同的課(即不能有兩個學生選同一門課) 2.每門課都有一個代表(即P門課都被成功選過) 今天學姐講匹配時講的題目&#…

進程編譯連接動態庫,需要將動態庫改為lib***.so

1、本身該庫可能編譯成npuDetect.so,但是需要改其名字為libnpuDetect.so,CMakelists才能找到該庫 2、進程中連接動態庫&#xff0c;如果該庫還依賴別的動態庫&#xff0c;則需要繼續把其他的庫也要連接進來

Drbd+Pacemaker實現高可用

What is Pacemaker? Pacemaker是一個集群資源管理器。它利用集群基礎構件&#xff08;OpenAIS 、heartbeat或corosync&#xff09;提供的消息和成員管理能力來探測并從節點或資源級別的故障中恢復&#xff0c;以實現群集服務&#xff08;亦稱資源&#xff09;的最大可用性。 前…

matlab常用函數——矩陣函數

五、數組和矩陣函數 1)數組基本函數 display:顯示字符或者數組 isempty :判斷數組是否為空,空返回1,不空返回0 isequal :判斷數組是否相同 (認為NaN不同) isequalwithequalnans:判斷數組是否相同,把NaN看成相同的數 isfinite :判斷數組元素是否為有限數 isfloat…

記錄下面試中的回答的不好的問題

1 伙伴系統在linux中的作用&#xff0c;具體咋回事 2 tcp擁塞控制 滑動窗口 3 linux sed&#xff0c;awk的具體使用 4 ftp哪幾種模式 5 中斷與輪詢 6 C stl的vector是怎么是實現的 7 I/O多路復用是怎么回事&#xff0c;select(),epoll()具體怎么回事。 一個文件中每行一個單詞&…

Python 字符串操作(string替換、刪除、截取、復制、連接、比較、查找、包含、大小寫轉換、...

去空格及特殊符號 s.strip().lstrip().rstrip(,) 復制字符串 #strcpy(sStr1,sStr2)sStr1 strcpysStr2 sStr1 sStr1 strcpy2print sStr2 連接字符串 #strcat(sStr1,sStr2)sStr1 strcatsStr2 appendsStr1 sStr2print sStr1 查找字符 #strchr(sStr1,sStr2)# < 0 為未找到…

周賽題解

A - An easy problemTime Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2601Description When Teddy was a child , he was always thinking about some simple math problems ,such as “What it’s 1 cup of wa…

matlab常用函數——數學函數

六、基本數學函數 1)基本運算符 +:加法運算符 -:減法運算符 *:矩陣乘法 .*:數組乘法 /:斜杠或者矩陣右除 B/A等于公式B*inv(A) ./:數組右除 A./B等于A(i,j)/B(i,j) \:反斜杠或者矩陣左除 A\B等于inv(A)*B .\:數組左除 A.\B等于B(i,j)/A(i,j) ^…

內存容量出現異常的解決辦法

【鄙視360人工服務工程師 笨死你!】 如果哪天的內存容量突然出現了異常 而且發現只有一半可以使用的時候 不是內存出現了問題 而是設置的問題。 【win 7 win 8 win 10通用的解決辦法】 問題描述&#xff1a; 我是win 10 64位系統 內存容量突然只有一半了 打開我的電腦的設置看了…

Oracle 變量綁定與變量窺視合集系列一

《Oracle 變量綁定與變量窺視合集》 數據庫環境 LEO1LEO1> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production PL/SQL R…

(原創)對某國的一次滲透

文章均由自己原創&#xff0c;只是一直沒有在自己博客發表。本地附件也沒有了&#xff0c;我是從網上找來我的以前的投稿。 寫在之前的廢話&#xff1a;小菜技術能力不行&#xff0c;如果你覺得此文實在看不下去&#xff0c;還請PASS掉。如果你對我的文章有興趣&#xff0c;可以…

matlab常用函數——方程函數

八、插值函數、線性方程解函數和多項式函數 1)插值函數 interp1q :1維快速線性插值法 yi=interp1q(x,Y,xi) interp1q正常執行條件: (1)x單調遞增列向量 (2)Y為列向量or行數為length(x)(3)xi為列向量,如果xi值在x的坐標范圍外,返回NaN 實例: x=(-5:0.5:5); y=sin…

C/C++ | 字節對齊

目的&#xff1a;優化CPU訪問數據效率 類型轉換&#xff1a;未對齊時&#xff0c;嚴格一些的系統會報段錯誤&#xff0c;未報錯的話效率也會有所下降。 各種結構的對齊&#xff1a; 編譯器的區別&#xff1a; 其實字節對齊的細節和具體編譯器實現相關&#xff0c;但一般而言&am…

關于python測試webservice接口的視頻分享

現在大公司非常流行用python做產品的測試框架&#xff0c;還有對于一些快速原型產品的開發也好&#xff0c;很好地支持OO編程&#xff0c;代碼易讀。 Python的更新挺快的&#xff0c;尤其是第三方庫。 對于測試人員&#xff0c;代碼基礎薄弱&#xff0c;用python語言容易上手。…

matlab常用函數——文件操作函數

十一、基本文件操作函數 1)文件創建函數 filemaker :把文件名與文件中函數名分開 。 filesep :文件目錄分隔。 fileparts :把目標文件名拆分成字符串形式輸出 。 tempdir :返回系統暫存地址名 。 tempname :返回系統暫存文件名 。 fullfile :創建文件名 2)文件打…