당시 생 성기

7157 단어 pythonNLP
당시 어 료 라 이브 러 리 를 사용 하여 소음 제거 예 처리, 분사, 조합 생 성, 주제 생 성 등 과정 을 거 쳐 당 시 를 생 성 한다.
csdn 다운로드 주소:http://download.csdn.net/detail/lijiancheng0614/9840952 github 의 reposcory 주소:https://github.com/lijiancheng0614/poem_generator
환경.
  • Python 2.7
  • Flask
  • jieba

  • 운행 방법
    첫 번 째 실행 이 라면 관련 라 이브 러 리 를 설치 하고 초기 데 이 터 를 생 성 해 야 합 니 다.
    pip install flask
    pip install jieba
    python preprocess.py
    python get_collocations.py
    python get_topic.py
    python get_start_words.py

    이후 다음 코드 만 입력 하면 웹 사 이 트 를 실행 할 수 있 습 니 다.
    python index.py

    이루어지다
    예비 처리
    주어진 당시 언어 자료 창고 에 다음 과 같은 소음 이 존재 하 는 것 을 관찰 했다.
  • 시구 에 비슷 한 <img height=32 width=32 border=0 src=/bzk/QLXQ.bmp > HTML 라벨 이 나 왔 다.
  • 빈 칸, "." 등의 문자 가 나타 납 니 다.
  • 시구 에 주석 이 나 와 '(', ')' 로 표시 한다.
  • 시구 가 완전 하지 않 고 사각형 문자 가 나타난다.

  • 앞의 세 가지 상황 의 소음 에 대해 서 는 직접 제거 하면 된다.마지막 소음 에 대해 서 는 직접 이 시 구 를 고려 하지 않 는 다.(그 밖 에 세 번 째 소음 에 대해 '(', ')' 는 같은 줄 에 있 지 않 을 때 처리 되 지 않 았 다.)
    잠시 당시 의 제목 과 시구 만 사용 해 야 하기 때문에 이 두 부분 만 추출 할 수 있다.
    관련 코드 구현 preprocess.py.
    입력:
  • .\data\ .txt

  • 출력:
  • .\data\poem.txt

  • 분사
    중국어 단어 에 대해 여 기 는 산업 계 에서 광범 위 하 게 응용 되 는 '말 더 듬 기' 중국어 단어 구성 요소 1 을 사용한다.이 단어 구성 요 소 는 주로 다음 과 같은 알고리즘 을 사용 합 니 다. Trie 트 리 구 조 를 바탕 으로 효율 적 인 단어 그림 스 캔 을 실현 하고 문장 에서 한자 가 될 수 있 는 모든 단어 상황 으로 구 성 된 방향 무 환 도 (DAG) 를 생 성 합 니 다.동적 계획 으로 최대 확률 경 로 를 찾 아 단어의 주파 수 를 바탕 으로 하 는 최대 절 분 된 조합 을 찾 습 니 다.미등 록 어 에 대해 서 는 한자 성어 능력 에 기반 한 HMM 모델 을 적용 해 Viterbi 알고리즘 을 사용 했다.
    당시 의 모든 글 자 는 기본적으로 유용 하기 때문에 사용 정지 단어 (Stop Words) 는 주로 문장 부호 이 고 여 기 는 기본 적 인 사용 정지 단 어 를 직접 사용 합 니 다.
    조합 생 성
    코 디 는 가로 코 디 와 세로 코 디 를 포함한다.가로 조합 은 모든 시 에서 모든 단어 와 다음 단어의 조합 관 계 를 말 하 는데 세로 조합 은 모든 두 문장 시 에서 첫 번 째 시 에서 의 단어 와 다음 시 에서 똑 같은 길이 의 단어의 조합 관 계 를 말한다.
    단 어 를 나 눈 후에 당시 (제목 이 포함 되 지 않 음) 를 문장 에 따라 자 르 고 문장의 총수 가 짝수 인 당 시 를 두 문장 씩 옮 겨 다 니 며 첫 번 째 시의 단 어 는 두 번 째 시 에 대응 하 는 똑 같은 길이 의 단어 와 세로 로 조합 된다.모든 시 에 대해 두 단어 마다 하나의 가로 조합 을 형성한다.
    쉽게 알 수 있 듯 이 싱크로 율, 주파수, t 검 측 등 조합 발견 방법 을 사용 하면 좋 은 결 과 를 얻 을 수 있 습 니 다. 여 기 는 편 의 를 위해 빈 도 를 직접 사용 하여 조합 을 발견 할 수 있 습 니 다.
    관련 코드 구현 get_collocations.py.
    입력:
  • .\data\poem.txt

  • 출력:
  • 가로 코 디 .\data\collocations_h
  • 세로 코 디 .\data\collocations_v
  • 테마 생 성
    각 시 에 대해 TF - IDF 2 특징 을 추출 하고 행렬 3 을 구축 한 후 비 네 거 티 브 매트릭스 분해 (Non - negative matrix factorization, NMF) 45 를 사용 하여 당시 주제 유형 을 추출한다.당시 의 분류 수량 이 제한 되 어 있 음 을 감안 하여 여 기 는 10 가지 유형 만 생 성 되 고 각 유형 은 빈도 가 가장 높 은 20 개의 단어 로 표시 한다.
    관련 코드 구현 get_topic.py.
    입력:
  • .\data\poem.txt

  • 출력:
  • 주제 .\data\topics.txt
  • 단어 .\data\words
  • 각 주제 - 단어 에 대응 하 는 득점 .\data\topic_words
  • 시작 단어 생 성
    모든 시 에 대해 단 어 를 나 눈 후에 첫 번 째 시의 첫 번 째 단 어 를 시작 으로 한다.모든 시작 어 를 집계 하고 두 번 이 넘 는 단 어 를 출력 한다.
    관련 코드 구현 get_start_words.py.
    입력:
  • .\data\poem.txt

  • 출력:
  • 시작 사 .\data\start_words.txt
  • 당 시 를 만들다
    초기 에 평측 처리 도 하지 않 았 고 당시 의 언어 자료 창고 에 대해 너무 많은 요 구 를 하지 않 았 기 때문에 생 성 된 당 시 는 전쟁 에 그다지 정연 하지 않 을 것 이다.
    입력 한 매개 변 수 는 상기 생 성 된 일부 파일 (예 를 들 어 조합, 주제 등) 을 제외 하고 시구 의 수량, 시구 의 길이, 주제 와 시작 어 (지정 하지 않 으 면 무 작위 로 생 성) 를 지정 해 야 합 니 다.
    주어진 시구 길이 l, 시작 사 start워드 와 테마 topicid, a [i] 를 i 라 는 단어의 id 로 설정 하면 우 리 는 첫 번 째 시 를 하나의 문제 로 추상 화 할 수 있다.
    maxs.t.∏i=2ncollocations_h_score[a[i−1]][a[i]]+λ∑i=1ntopic_word[topic_id][a[i]]∑i=1nlen(word[a[i]])=la[1]=start_word
    그 중 collocationsh_score [a [i - 1] [a] 는 i - 1 단어 와 i 단어의 가로 조합 점 수 를 나타 낸다.λ 평형 매개 변수.상기 문제 의 최 적 화 를 a [i] 로 풀 면 비교적 합 리 적 인 첫 번 째 시 는 워드 [1], 워드 [2], 등, 워드 [n] 입 니 다.
    분명히 이 문제 에 대해 서 는 목표 함수 의 곱 하기 부분 을 log 로 구 화 시 킬 수 있다.그래서 이 문 제 는 동태 적 인 계획 으로 해결 할 수 있다.
    f [i] [j] 를 설정 하면 길 이 는 i 이 고 마지막 단어 id 는 j 의 최대 목표 함수 값 입 니 다.
    f[i][j]=max{f[i−len(word[j])][k]+log_collocations_h_score[k][j]}+λtopic_word[j]
    그 중에서 (k, j) 는 가로 조합 이다.
    초기 f [len (start word id)] [start word id] =λtopic_word[start_word_id] 。
    마지막 으로 가장 좋 은 값 은 f [l] [j] 이 고 8704 ° j 이 며 경 로 는 f f 와 같은 크기 의 행렬 pre pre 를 통 해 이전 단어의 id 를 기록 할 수 있 습 니 다.
    다음 시가 생기 면 세로 조합 을 고려 해 야 한다.마찬가지 로 우 리 는 다음 시 를 하나의 문제 로 추상 화 할 수 있다.
    \begin{array}{cl} \max & \prod_{i = 2}^n collocations\_h\_score[a[i - 1]][a[i]] \\ & + \lambda_1 \prod_{i = 1}^n collocations\_v\_score[pre\_a[i]][a[i]] \\ & + \lambda_2 \sum_{i = 1}^n topic\_word[topic\_id][a[i]] \\ \text{s.t.} & len(word[a[i]]) = len(word[pre\_a[i]]), i = 1, \cdots, n \end{array}
    maxs.t.∏i=2ncollocations_h_score[a[i−1]][a[i]]+λ1∏i=1ncollocations_v_score[pre_a[i]][a[i]]+λ2∑i=1ntopic_word[topic_id][a[i]]len(word[a[i]])=len(word[pre_a[i]]),i=1,⋯,n
    그 중 prea [i] 지난 시의 i 번 째 단 어 를 나타 내 는 id, collocationsv_score [pre a [i] [a]] 는 지난 시의 i 번 째 단어 와 이 시의 i 번 째 단어의 수직 조합 점 수 를 나타 낸다.λ1,λ2. 모두 균형 적 인 매개 변수 입 니 다.같은 이치 로 도 동적 계획 으로 해답 을 구한다.
    f [i] [j] 를 설정 하면 i 번 째 단 어 를 표시 하고 마지막 단어 id 는 j 의 최대 목표 함수 값 입 니 다.
    f[i][j]=max{f[i−1][k]+log_collocations_h_score[k][j]+λ1log_collocations_v_score[pre_a[i]][j]}+λ2topic_word[j]
    그 중에서 (k, j) 는 가로 조합 이 고 (pre a [i], j) 는 세로 조합 이다.
    초기 f [0] [j] = max {λ1log_collocations_v_score[pre_a[i]][j]}+λ2topic_word[j]
    최 우수 치 와 최 우수 해법 을 구하 다.
    관련 코드 구현 generate_poem.py.
    입력:
  • .\data\collocations_v
  • .\data\collocations_h
  • .\data\words.txt
  • .\data\topic_words
  • .\data\start_words.txt

  • 출력:
  • 화면 에 무 작위 로 생 성 된 당 시 를 출력 합 니 다.

  • 사이트 구현
    더 좋 은 사용자 체험 을 위해 무 작위 로 만들어 진 당 시 를 하나의 사이트 인 '고시 생 성기' 로 쓸 수 있다.사용자 가 입력 하지 않 으 면 당 시 를 무 작위 로 생 성 합 니 다.사용자 가 첫 번 째 시 나 더 많은 시 를 입력 하면 나머지 시 를 생 성 한다.
    구체 적 인 실현 은 Flask 프레임 워 크 를 사용 합 니 다. demo 일 뿐 boottstrap 만 스타일 로 사 용 했 기 때문에 디자인 이 많 지 않 습 니 다. 구체 적 인 효 과 는 다음 그림 과 같 습 니 다.
    총화 와 전망
    전체적으로 보면 이 시스템 에서 생 성 된 당 시 는 조합 과 주제 가 가능 한 한 관련 된 요구 에 부합 되 고 평측, 취지 등 당시 의 속성 은 개선 되 어야 한다.앞 으로 는 문헌 6 과 같은 보다 정확 하고 의미 있 는 당 시 를 만 드 는 것 을 고려 할 수 있다.앞으로 더 좋 은 효 과 를 기대 합 니 다!
    레 퍼 런 스
    "말 더 듬 기" 중국어 단어.https://github.com/fxsjy/jieba ↩
    TF - IDF. 위 키 피 디 아. 마지막 으로 2015 년 9 월 27 일 에 수정 되 었 습 니 다.https://zh.wikipedia.org/wiki/TF-IDF ↩
    sklearn.feature_extraction.text.TfidfTransformer. scikit-learn developers. http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfTransformer.html ↩
    Non - negative matrix factorization. Wikipedia. 마지막 으로 2015 년 12 월 1 일 에 수정 되 었 습 니 다.https://en.wikipedia.org/wiki/Non-negative_matrix_factorization ↩
    sklearn.decomposition.NMF. scikit-learn developers. http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.NMF.html ↩
    He J, Zhou M, Jiang L. Generating chinese classical poems with statistical machine translation models[C]//Twenty-Sixth AAAI Conference on Artificial Intelligence. 2012. ↩

    좋은 웹페이지 즐겨찾기