Python 예측 분사 의 실현
기계 학습 에서 우 리 는 훈련 집 이 생기 면 예측 하기 시작한다.예측 은 모형 을 이용 하여 문장 을 추정 하 는 과정 을 말한다.중국어 분사 임무 에서 모델 을 이용 하여 분사 서열 을 추정 하 는 동시에 디 코딩 이 라 고도 부른다.
한 LP 라 이브 러 리 에서 이원 문법 디 코딩 은 Viterbi Segment 분사 기 에서 제공 합 니 다.이 편 은 Viterbi Segment 의 사용 방식 을 상세 하 게 소개 할 것 이다.
로드 모델
전편 박문 에서 우 리 는 이미 훈련의 일원,이원 문법 모델 을 얻 었 다.후속 처 리 는 반드시 이 몇 개의 파일 에 근거 하여 처리 할 것 이다.그래서 우리 가 먼저 해 야 할 일 은 이 모델 들 을 프로그램 에 불 러 오 는 것 이다.
if __name__ == "__main__":
MODEL_PATH = "123"
HanLP.Config.CoreDictionaryPath = MODEL_PATH + ".txt"
HanLP.Config.BiGramDictionaryPath = MODEL_PATH + ".ngram.txt"
CoreDictionary = SafeJClass("com.hankcs.hanlp.dictionary.CoreDictionary")
CoreBiGramTableDictionary = SafeJClass('com.hankcs.hanlp.dictionary.CoreBiGramTableDictionary')
print(CoreDictionary.getTermFrequency(" "))
print(CoreBiGramTableDictionary.getBiFrequency(" "," "))
실행 후 효 과 는 다음 과 같 습 니 다.여기 서 우 리 는 CoreDictionary.getTermFrequency()방법 으로'진기'의 빈 도 를 얻 습 니 다.CoreBiGramTableDictionary.getBiFrequency()방법 으로'진기 의'이원 문법 빈 도 를 얻 습 니 다.
어망 을 구축 하 다
앞에서 우 리 는 기호'말\#말'을 소개 하여 문장의 끝 을 대표 하고'시\#시'는 문장의 시작 을 대표 한다.한편,어망 은 문장 중의 모든 일원 문법 으로 구 성 된 그물 모양 구 조 를 말한다.예 를 들 어 MSR 사전 중의'진기 와 과학 기술'이라는 문장 은 주어진 일원 사전 이다.우 리 는 문장의 모든 단 어 를 찾 아 냈 다.다음 단어 망 을 가 져 옵 니 다.
[ ## ]
[ ]
[]
[ , ]
[ ]
[ ]
[ ## ]
대응 하 는 이 그림 은 다음 과 같다.물론 여기 블 로 거들 은 예 를 들 어 어망 의 개념 을 설명 할 뿐'화 과'는 한 단어 가 아니다.
다음은 방법 을 통 해 어망 을 구축 하 겠 습 니 다.구체 적 인 코드 는 다음 과 같다.
def build_wordnet(sent, trie):
JString = JClass('java.lang.String')
Vertex = JClass('com.hankcs.hanlp.seg.common.Vertex')
WordNet = JClass('com.hankcs.hanlp.seg.common.WordNet')
searcher = trie.getSearcher(JString(sent), 0)
wordnet = WordNet(sent)
while searcher.next():
wordnet.add(searcher.begin + 1,
Vertex(sent[searcher.begin:searcher.begin + searcher.length], searcher.value, searcher.index))
# ,
vertexes = wordnet.getVertexes()
i = 0
while i < len(vertexes):
if len(vertexes[i]) == 0: #
j = i + 1
for j in range(i + 1, len(vertexes) - 1): # j
if len(vertexes[j]):
break
wordnet.add(i, Vertex.newPunctuationInstance(sent[i - 1: j - 1])) # [i, j)
i = j
else:
i += len(vertexes[i][-1].realWord)
return wordnet
if __name__ == "__main__":
MODEL_PATH = "123"
HanLP.Config.CoreDictionaryPath = MODEL_PATH + ".txt"
HanLP.Config.BiGramDictionaryPath = MODEL_PATH + ".ngram.txt"
CoreDictionary = SafeJClass("com.hankcs.hanlp.dictionary.CoreDictionary")
CoreBiGramTableDictionary = SafeJClass('com.hankcs.hanlp.dictionary.CoreBiGramTableDictionary')
print(build_wordnet(" ", CoreDictionary.trie))
운행 한 후에 우 리 는 위의 그림 과 차이 가 많 지 않 은 내용 을 얻 을 수 있다.비트 비 알고리즘
만약 에 지금 우리 가 상기 단어 그림 의 모든 변 에 이원 문법 확률 을 거리 로 한다 면 단어 그림 의 가장 짧 은 경 로 를 어떻게 구 하 느 냐 가 관건 적 인 문제 이다.
텍스트 길이 가 n 이 라 고 가정 하면 모두 2(n-1 차방)가지 절 분 방식 이 있 습 니 다.두 글자 사이 에 두 가지 선택 이 있 기 때 문 입 니 다.자 르 거나 자 르 지 않 으 면 시간 복잡 도 는 O(2(n-1 차방)입 니 다.분명히 현실 에 맞지 않 는 다.여기 서 우 리 는 위 트 비 알고리즘 을 사용 하 는 것 을 고려 하고 있다.
비트 비 알고리즘 원리:그것 은 전방 향 과 후방 향 두 단계 로 나 뉜 다.
4.567917.앞 방향:출발점 에서 출발 하여 앞 뒤로 노드 를 옮 겨 다 니 고 출발점 에서 이 노드 까지 의 최 하 비용 과 전구 지침 을 업데이트 합 니 다4.567917.후 방향:종점 에서 출발 하여 뒤에서 전구 지침 을 거 슬러 올 라 가 가장 짧 은 경 로 를 얻는다비트 비 알고리즘 은 python 코드 로 다음 과 같이 실 현 됩 니 다.
def viterbi(wordnet):
nodes = wordnet.getVertexes()
#
for i in range(0, len(nodes) - 1):
for node in nodes[i]:
for to in nodes[i + len(node.realWord)]:
# , from
to.updateFrom(node)
#
#
path = []
#
f = nodes[len(nodes) - 1].getFirst()
while f:
path.insert(0, f)
# from
f = f.getFrom()
return [v.realWord for v in path]
실전이제 테스트 를 해 보 겠 습 니 다.저 희 는 msr 에 있 습 니 다.test_gold.utf 8 에서 훈련 모델 은 진기 와 과학 기술 에서 흔히 볼 수 있 는 단어 그림 으로 마지막 으로 비트 비 알고리즘 을 운행 한다.상세 코드 는 다음 과 같다.
if __name__ == "__main__":
MODEL_PATH = "123"
corpus_path = r"E:\ProgramData\Anaconda3\Lib\site-packages\pyhanlp\static\data\test\icwb2-data\gold\msr_test_gold.utf8"
train_model(corpus_path, MODEL_PATH)
HanLP.Config.CoreDictionaryPath = MODEL_PATH + ".txt"
HanLP.Config.BiGramDictionaryPath = MODEL_PATH + ".ngram.txt"
CoreDictionary = SafeJClass("com.hankcs.hanlp.dictionary.CoreDictionary")
CoreBiGramTableDictionary = SafeJClass('com.hankcs.hanlp.dictionary.CoreBiGramTableDictionary')
ViterbiSegment = JClass('com.hankcs.hanlp.seg.Viterbi.ViterbiSegment')
MODEL_PATH = "123"
HanLP.Config.CoreDictionaryPath = MODEL_PATH + ".txt"
HanLP.Config.BiGramDictionaryPath = MODEL_PATH + ".ngram.txt"
sent = " "
wordnet = build_wordnet(sent, CoreDictionary.trie)
print(viterbi(wordnet))
어떤 사람들 은 의문 이 있 을 수 있다.왜냐하면 이원 모델 에는 그 자체 가 진기 와
과학 기술 이라는 견본.이렇게 하 는 것 은 쓸데없는 짓 이 아니 냐?좋 습 니 다.우 리 는 sent 의 텍스트 내용 을'베 이 징 과 광저우'로 바 꾸 었 습 니 다.이 견본 은 모델 에 있 지 않 습 니 다.실행 후 효 과 는 다음 과 같 습 니 다.
우 리 는 여전히 정확 한 단 어 를[베 이 징 과 광저우]로 나 눌 수 있다 는 것 을 발견 했다.이것 이 바로 이원 문법 모델 의 일반화 능력 이다.이로써 우 리 는 언어 자료 표시,훈련 모델,분사 결 과 를 예측 하 는 완전한 절 차 를 밟 았 다.
파 이 썬 예측 분사 의 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 예측 분사 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.