당시 생 성기
csdn 다운로드 주소:http://download.csdn.net/detail/lijiancheng0614/9840952 github 의 reposcory 주소:https://github.com/lijiancheng0614/poem_generator
환경.
운행 방법
첫 번 째 실행 이 라면 관련 라 이브 러 리 를 설치 하고 초기 데 이 터 를 생 성 해 야 합 니 다.
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. ↩
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.