Python 자연 언어 처리 의 절 분 알고리즘 상세 설명

머리말
우 리 는 어떤 말 을 분석 해 야 한다.반드시 이 문장의 단 어 를 검사 해 야 한다.
일반적으로 한 마디 에 여러 개의 단 어 를 포함 하고 서로 중첩 되 며 구체 적 으로 출력 하 는 것 은 자연 언어의 절 분 알고리즘 에 의 해 결정 된다.자주 사용 하 는 절 분 알고리즘 은 완전 절 분,정방 향 최 장 일치,역방향 최 장 일치 와 양 방향 최 장 일치 가 있 습 니 다.
이 박문 은 자주 사용 하 는 절 분 알고리즘 을 일일이 소개 할 것 이다.
완전히
완전 절 분 은 텍스트 의 모든 단 어 를 찾 는 것 을 말한다.
효율 을 고려 하지 않 으 면 완전 절 분 알고리즘 은 사실 매우 간단 하 다.텍스트 의 연속 시퀀스 만 옮 겨 다 니 면 이 시퀀스 가 사전 에 있 는 지 확인 하면 됩 니 다.지난 편 에서 우 리 는 사전 의 모든 단어 dic 를 얻 었 다.여기 서 우 리 는 코드 로 특정한 텍스트 를 옮 겨 다 니 며 모든 단 어 를 완전히 나 누 었 다.코드 는 다음 과 같 습 니 다:

from pyhanlp import *


def load_dictionary():
    IOUtil = JClass('com.hankcs.hanlp.corpus.io.IOUtil')
    path = HanLP.Config.CoreDictionaryPath.replace('.txt', '.mini.txt')
    dic = IOUtil.loadDictionary([path])
    return set(dic.keySet())


def fully_segment(text, dic):
    list = []
    for i in range(len(text)):
        for j in range(i + 1, len(text) + 1):
            temp = text[i:j]
            if temp in dic:
                list.append(temp)
    return list


if __name__ == "__main__":
    dic = load_dictionary()
    print(fully_segment("       ,         ", dic))
词汇
완전 분할 알고리즘 이 텍스트 의 모든 단어 와 어 휘 를 출력 한 것 을 볼 수 있 습 니 다.
여기 서 알고리즘 원 리 는 한 글 자 를 옮 겨 다 니 기 시작 하고 이 글 자 를 비롯 하여 뒤의 모든 글 자 를 한 글자 에 순서대로 조합 하여 이 조합 문구 들 이 사전 에 있 는 지 분석 하 는 것 이다.두 번 째,두 번 째 글자 부터 뒤의 글 자 를 조합 하여 유추 한다.모 르 는 것 은 다음 그림 을 보면 알 수 있다.
遍历
3.정방 향 최 장 일치
사전 에 나타 난 모든 단어,단 어 를 완전히 구분 할 수 있다 고 하지만 우 리 는 문장 에 있 는 단 어 를 얻 는 것 은 일반적으로 아무런 의미 가 없다.우 리 는 중국어 단어,그런 의미 있 는 단어 서열 을 얻 고 싶다.
예 를 들 어 위 에서 우 리 는'절대 실력'이'절대'+'실력'같은 조각 이 아니 라 전체 단어 가 되 기 를 바란다.이 목적 을 달성 하기 위해 서 우 리 는 우리 의 알고리즘 을 보완 해 야 한다.긴 단어 일수 록 표현의 의미 가 풍부 하 다 는 점 을 감안 하여 우 리 는 단어 가 길 수록 우선 순위 가 높다 고 정의 한다.
구체 적 으로 말 하면 특정한 아래 표 시 를 기점 으로 검색 어 를 증가 시 키 는 과정 에서 더 긴 단 어 를 우선 출력 하 는 규칙 을 최 장 일치 알고리즘 이 라 고 한다.이 아래 표 시 된 스 캔 순 서 는 앞 뒤로 가면 정방 향 최 장 일치 라 고 하고,반대로 역방향 최 장 일치 라 고 합 니 다.
다음은 정방 향 최 장 매 칭 을 실현 합 니 다.코드 는 다음 과 같 습 니 다.

def forward_segment(text, dic):
    list = []
    i = 0
    while i < len(text):
        long_word = text[i]
        for j in range(i + 1, len(text) + 1):
            word = text[i:j]
            if word in dic:
                if len(word) > len(long_word):
                    long_word = word
        list.append(long_word)
        i += len(long_word)
    return list
알고리즘 원리:우선 while 순환 을 통 해 i 가 문자열 의 크기 를 초 과 했 는 지 판단 합 니 다.없 으 면 현재 첫 번 째 문자열 을 첫 번 째 최 장 일치 결과 로 가 져 옵 니 다.그 다음 에 첫 번 째 문자열 의 모든 조합 끝 을 옮 겨 다 니 며 사전 에서 현재 단어 가 앞의 최 장 일치 결과 보다 큰 지 판단 합 니 다.만약 에 가장 긴 것 을 교체 하 는 것 이 라면.옮 겨 다 니 기 가 끝 난 후 가장 긴 결 과 를 목록 에 추가 한 다음 두 번 째 문 자 를 가 져 오고 모든 끝 조합 을 옮 겨 다 니 며 가장 긴 일치 성 을 가 져 옵 니 다.이런 식 으로 유추 하 다.
4.역방향 최 장 일치
정방 향 이 어떻게 일치 하 는 지 알 게 된 이상 역방향 알고리즘 도 잘 쓸 수 있 을 것 이다.코드 는 다음 과 같 습 니 다:

def backward_segment(text, dic):
    list = []
    i = len(text) - 1
    while i >= 0:
        long_word = text[i]
        for j in range(0, i):
            word = text[j:i + 1]
            if word in dic:
                if len(word) > len(long_word):
                    long_word = word
                    break
        list.append(long_word)
        i -= len(long_word)
    return list
알고리즘 의 원리:바로 위의 정방 향 이 반대 되 는 것 입 니 다.그러나 여 기 는 거꾸로 문 자 를 밀어 내 는 것 이 아니 라 문 자 는 문장의 순서 입 니 다.그러나 길 이 는 가장 길 고 가장 짧 습 니 다.즉,첫 번 째 를 만나면 다시 추가 할 수 있 습 니 다.정방 향 최 장 일치 알고리즘 보다 시간 을 절약 합 니 다.
5.양 방향 최 장 일치
역방향 은 정방 향 보다 시간 을 절약 하지만 그 자체 에 큰 구멍 이 있다.만약 에 제 가 현재 문장 에'항목 의'문자열 이 있다 면 정방 향 으로 는'항목','의'두 단어 가 나타 나 고 역방향 으로 는'항목','목적'두 단어 가 나타 납 니 다.
이 를 위해,우리 알고리즘 엔 지 니 어 는 양 방향 최 장 일치 규칙 을 제시 했다.이것 은 두 가지 일치 하 는 방법 을 융합 시 키 는 복잡 한 규칙 으로 절 차 는 다음 과 같다.
동시에 정방 향 과 역방향 최 장 일치 하 는 것 을 실행 합 니 다.만약 에 두 단어의 수가 다 르 면 단어의 수가 더 적은 것 을 되 돌려 줍 니 다.그렇지 않 으 면 두 글자 중 한 글자 가 더 적은 것 을 되 돌려 줍 니 다.한 글자 도 동시에 역방향 최 장 일치 결 과 를 우선 되 돌려 줍 니 다.
구체 적 인 코드 는 다음 과 같다.

#      
def count_single_char(list):
    return sum(1 for word in list if len(word) == 1)

#      
def bidirectional_segment():
    f = forward_segment("       ,         ", dic)
    b = backward_segment("       ,         ", dic)
    if len(f) < len(b):
        return f
    elif len(f) > len(b):
        return b
    else:
        if count_single_char(f)<count_single_char(b):
            return f
        else:
            return b
파 이 썬 의 자연 언어 처리 에 관 한 절 분 된 알고리즘 에 대한 상세 한 설명 은 여기까지 입 니 다.더 많은 파 이 썬 절 분 된 알고리즘 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기