그래서 최근에 NLP로 작업 해 왔고 / test /와 같은 매우 간단한 일치 이외의 다른 것에 정규식 구문을 사용하는 데 문제가 있습니다. 제가 찾고있는 최종 게임은 콘텐츠 어딘가에 특정 단어가 포함 된 구문을 일치시키는 것입니다. 내가 모델링하려는 음성 패턴은 매우 구조화되어 있지만 인간의 음성은 가변적이므로 구문은 무수히 많은 방법을 시작할 수 있지만 구문에 특정 키워드가 포함되어있는 한 세고 싶습니다. 따라서 예를 들어 TokensRegex에서 모델링하려는 정규식은 다음과 같습니다.
.*(show).*(cars).*(\d{0,9})(km|mi).*
다음과 같은 구문과 일치합니다.
"please show me all cars within 100 km of me"
복잡한 문구를 만들 수 있다는 것은 문서에서 나에게 분명하지 않습니다. 가능한 경우 구문으로 변환하는 방법을 보는 데 문제가 있습니다. 내가 일치하는 것처럼 보이는 것에 가장 가까운 것은 다음과 같습니다.
"[]*/(show)/[]*/(cars)/[]*[word>=0]/(kilometer|miles)/[]"
이것은 일치를 확인하는 데 사용하는 코드의 일부입니다.
//value is the regex, tokens is the List<CoreLabel>s of text to try and match
pattern = TokenSequencePattern.compile(value);
TokenSequenceMatcher matcher = pattern.getMatcher(tokens);
while (matcher.find()) {
String matchedString = matcher.group();
System.out.println(matchedString);
return true;
}
디버깅 할 때 매처 내부의 요소가 CoreLabels 목록임을 알 수 있습니다.
(show,me,all,cars,within,a,hundred,kilometers,of,me)
패턴은 SequencePattern 목록으로 컴파일됩니다.
(*,TextAnnotation:/show/,*,TextAnnotation:/cars/,*,TextAnnotation GE 0.0, TextAnnotation:/(kilometer[s]?|mile[s]?)/,*)
나에게 그것은 일치해야 할 것 같지만 그렇지 않습니다. 다음과 같이 제거 된 것조차 :
show me all cars
정규식으로 :
[]/show/[]/cars/[]
일치하지 않으므로 정규식을 올바르게 설정하지 않는쪽으로 기울게됩니다. TokensRegex의 한계에 대해 이해하지 못하는 것이 있거나 표현식을 올바르게 구성하지 않았습니까? 어떤 도움이라도 대단히 감사하겠습니다. 감사합니다!
내 문제에 대해 TokensRegex가 직접 필요하지 않은 것으로 나타났습니다. 제가 해결하려고했던 핵심은 구에서 숫자를 골라서 변환하는 것이었지만 CoreNLP의 NERClassifierCombiner를 사용하여 ouy를 고르고 대체하고 일반 정규식을 사용하여 업데이트 된 입력 구와 일치시킬 수 있다는 것을 깨달았습니다. 내가 한 작업의 예는 "15km 이내의 모든 자동차 표시"와 같은 구문의 경우 "15km 이내의 모든 자동차 표시"로 변환됩니다.
Sentence sentence = new Sentence(eventName);
String serializedClassifier = "english.muc.7class.distsim.crf.ser.gz";
NERClassifierCombiner combiner = null;
try {
combiner = new NERClassifierCombiner(serializedClassifier);
} catch (IOException e) {
e.printStackTrace();
}
List<String> reconstructedEventTokens = new ArrayList<>();
for (CoreLabel cl : combiner.classify(sentence.asCoreLabels())) {
if(cl.ner() == KBPRelationExtractor.NERTag.NUMBER.name){
reconstructedEventTokens.add(cl.get(CoreAnnotations.NumericCompositeValueAnnotation.class).toString());
}else{
reconstructedEventTokens.add(cl.originalText());
}
}
String newEvent = String.join(" ",reconstructedEventTokens);
System.out.println("matching phrase to check: "+newEvent);
Pattern pattern = Pattern.compile(value);
Matcher matcher = pattern.matcher(newEvent);
NER 툴킷을 찾기 위해 라이브러리를 좀 더 파헤 쳤지 만 지금은 매력적으로 작동합니다! 이것이 문구에서 숫자 또는 다른 엔티티를 찾으려고하는 다른 사람에게 도움이되기를 바랍니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다