압축을 푼 후 다음 파일을 꺼냅니다.
훈련 데이터: icwb2-data/training/pku_ training.utf8
테스트 데이터: icwb2-data/testing/pku_ test.utf8
올바른 단어 분할 결과: icwb2-data/gold/pku_ test_ gold.utf8
점수 도구: icwb2-data/script/socre
2 알고리즘 설명
알고리즘 가장 간단한 FMM(Forward Maximum Matching)입니다.
훈련 데이터를 사용하여 사전을 생성합니다.
테스트 데이터를 왼쪽에서 오른쪽으로 스캔하고 가장 긴 것을 만나면 분할합니다. 문장 끝까지 내려갑니다
참고: 원래의 알고리즘은 이 방법으로 60줄 이내에서 코드를 제어할 수 있다는 것을 확인했습니다. 숫자 문제가 잘 처리되지 않아서 숫자 처리를 추가했습니다.
3 소스 코드 및 설명
#! /usr/bin/env python # -*- coding: utf-8 -*- # Author: minix # Date: 2013-03-20 import codecs import sys # 由规则处理的一些特殊符号 numMath = [u'0', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9'] numMath_suffix = [u'.', u'%', u'亿', u'万', u'千', u'百', u'十', u'个'] numCn = [u'一', u'二', u'三', u'四', u'五', u'六', u'七', u'八', u'九', u'〇', u'零'] numCn_suffix_date = [u'年', u'月', u'日'] numCn_suffix_unit = [u'亿', u'万', u'千', u'百', u'十', u'个'] special_char = [u'(', u')'] def proc_num_math(line, start): """ 处理句子中出现的数学符号 """ oldstart = start while line[start] in numMath or line[start] in numMath_suffix: start = start + 1 if line[start] in numCn_suffix_date: start = start + 1 return start - oldstart def proc_num_cn(line, start): """ 处理句子中出现的中文数字 """ oldstart = start while line[start] in numCn or line[start] in numCn_suffix_unit: start = start + 1 if line[start] in numCn_suffix_date: start = start + 1 return start - oldstart def rules(line, start): """ 处理特殊规则 """ if line[start] in numMath: return proc_num_math(line, start) elif line[start] in numCn: return proc_num_cn(line, start) def genDict(path): """ 获取词典 """ f = codecs.open(path,'r','utf-8') contents = f.read() contents = contents.replace(u'\r', u'') contents = contents.replace(u'\n', u'') # 将文件内容按空格分开 mydict = contents.split(u' ') # 去除词典List中的重复 newdict = list(set(mydict)) newdict.remove(u'') # 建立词典 # key为词首字,value为以此字开始的词构成的List truedict = {} for item in newdict: if len(item)>0 and item[0] in truedict: value = truedict[item[0]] value.append(item) truedict[item[0]] = value else: truedict[item[0]] = [item] return truedict def print_unicode_list(uni_list): for item in uni_list: print item, def divideWords(mydict, sentence): """ 根据词典对句子进行分词, 使用正向匹配的算法,从左到右扫描,遇到最长的词, 就将它切下来,直到句子被分割完闭 """ ruleChar = [] ruleChar.extend(numCn) ruleChar.extend(numMath) result = [] start = 0 senlen = len(sentence) while start < senlen: curword = sentence[start] maxlen = 1 # 首先查看是否可以匹配特殊规则 if curword in numCn or curword in numMath: maxlen = rules(sentence, start) # 寻找以当前字开头的最长词 if curword in mydict: words = mydict[curword] for item in words: itemlen = len(item) if sentence[start:start+itemlen] == item and itemlen > maxlen: maxlen = itemlen result.append(sentence[start:start+maxlen]) start = start + maxlen return result def main(): args = sys.argv[1:] if len(args) < 3: print 'Usage: python dw.py dict_path test_path result_path' exit(-1) dict_path = args[0] test_path = args[1] result_path = args[2] dicts = genDict(dict_path) fr = codecs.open(test_path,'r','utf-8') test = fr.read() result = divideWords(dicts,test) fr.close() fw = codecs.open(result_path,'w','utf-8') for item in result: fw.write(item + ' ') fw.close() if __name__ == "__main__": main()
4 테스트 및 채점 결과
dw.py 학습 데이터를 사용하여 데이터를 테스트하고 결과 파일 생성
score를 사용하여 학습 데이터, 올바른 단어 분할 결과 및 생성된 결과를 기반으로 점수를 매깁니다.
tail을 사용하면 결과 파일의 마지막 몇 줄의 전체 점수를 볼 수 있습니다. , socre.utf8은 또한 많은 수의 비교 결과를 제공하여 단어 분할 결과가 충분하지 않은 부분을 찾는 데 사용할 수 있습니다.
참고: 전체 테스트 프로세스는 Ubuntu
에서 완료됩니다. $ python dw.py pku_training.utf8 pku_test.utf8 pku_result.utf8
$ perl 점수 pku_training.utf8 pku_test_gold.utf8 pku_result.utf8 > Score.utf8
$ tail -22 Score.utf8
삽입: 0
삭제: 0
교체: 0
NCHANGE: 0
진실: 27
NTEST: 27
참 단어 기억: 1.000
테스트 단어 정밀도: 1.000
=== 요약:
=== 총 삽입 수: 4623
=== 총 삭제 수: 1740
=== 총 대체 수: 6650
=== 총 변경 수: 13013
=== 총 TRUE WORD 개수: 104372
=== 총 테스트 단어 개수: 107255
=== 총 참 단어 기억률: 0.920
=== 총 테스트 단어 정밀도: 0.895
=== F 측정: 0.907
=== OOV 비율: 0.940
=== OOV 재현율: 0.917
=== IV 재현율 : 0.966
사전 기반 FMM 알고리즘은 아주 기본적인 단어 분할 알고리즘이지만 효과는 그다지 좋지는 않지만 충분히 간단하고 시작하기 쉽습니다. 연구가 심화되면 Python을 사용하여 다른 단어 분할 알고리즘을 구현할 수도 있습니다. 또 다른 느낌은 책을 읽을 때 가능한 한 많이 실현하려고 노력하면 이론의 모든 세부 사항에주의를 기울일만큼 충분한 열정을 갖게되고 너무 지루하고 무력감을 느끼지 않을 것이라는 것입니다.

Python은 게임 및 GUI 개발에서 탁월합니다. 1) 게임 개발은 Pygame을 사용하여 드로잉, 오디오 및 기타 기능을 제공하며 2D 게임을 만드는 데 적합합니다. 2) GUI 개발은 Tkinter 또는 PYQT를 선택할 수 있습니다. Tkinter는 간단하고 사용하기 쉽고 PYQT는 풍부한 기능을 가지고 있으며 전문 개발에 적합합니다.

Python은 데이터 과학, 웹 개발 및 자동화 작업에 적합한 반면 C는 시스템 프로그래밍, 게임 개발 및 임베디드 시스템에 적합합니다. Python은 단순성과 강력한 생태계로 유명하며 C는 고성능 및 기본 제어 기능으로 유명합니다.

2 시간 이내에 Python의 기본 프로그래밍 개념과 기술을 배울 수 있습니다. 1. 변수 및 데이터 유형을 배우기, 2. 마스터 제어 흐름 (조건부 명세서 및 루프), 3. 기능의 정의 및 사용을 이해하십시오. 4. 간단한 예제 및 코드 스 니펫을 통해 Python 프로그래밍을 신속하게 시작하십시오.

Python은 웹 개발, 데이터 과학, 기계 학습, 자동화 및 스크립팅 분야에서 널리 사용됩니다. 1) 웹 개발에서 Django 및 Flask 프레임 워크는 개발 프로세스를 단순화합니다. 2) 데이터 과학 및 기계 학습 분야에서 Numpy, Pandas, Scikit-Learn 및 Tensorflow 라이브러리는 강력한 지원을 제공합니다. 3) 자동화 및 스크립팅 측면에서 Python은 자동화 된 테스트 및 시스템 관리와 같은 작업에 적합합니다.

2 시간 이내에 파이썬의 기본 사항을 배울 수 있습니다. 1. 변수 및 데이터 유형을 배우십시오. 이를 통해 간단한 파이썬 프로그램 작성을 시작하는 데 도움이됩니다.

10 시간 이내에 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법은 무엇입니까? 컴퓨터 초보자에게 프로그래밍 지식을 가르치는 데 10 시간 밖에 걸리지 않는다면 무엇을 가르치기로 선택 하시겠습니까?

Fiddlerevery Where를 사용할 때 Man-in-the-Middle Reading에 Fiddlereverywhere를 사용할 때 감지되는 방법 ...

Python 3.6에 피클 파일로드 3.6 환경 보고서 오류 : modulenotfounderror : nomodulename ...


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기
