Python 예측 분사 의 실현

6772 단어 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 의 텍스트 내용 을'베 이 징 과 광저우'로 바 꾸 었 습 니 다.이 견본 은 모델 에 있 지 않 습 니 다.실행 후 효 과 는 다음 과 같 습 니 다.
效果如下
우 리 는 여전히 정확 한 단 어 를[베 이 징 과 광저우]로 나 눌 수 있다 는 것 을 발견 했다.이것 이 바로 이원 문법 모델 의 일반화 능력 이다.이로써 우 리 는 언어 자료 표시,훈련 모델,분사 결 과 를 예측 하 는 완전한 절 차 를 밟 았 다.
파 이 썬 예측 분사 의 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 예측 분사 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기