http://www.tuicool.com/articles/zq2yyi
blog.csdn.net/u010189459/...тема Сегментация китайских слов Python
В этой статье используется метод тегирования слов для сегментации китайских слов и используется 4-тег для маркировки корпуса, чтобы наблюдать эффект сегментации слов. С точки зрения модели используется инструментарий условного случайного поля с открытым исходным кодом.CRF++: Yet Another CRF toolkit", чтобы выполнить сегментацию слов.
Ресурсы корпуса китайского языка, использованные в этой статье, предоставлены SIGHAN.backoff 2005Корпус, в настоящее время лучшим результатом закрытого теста является сегментация слов с тегами 4-tag + CFR, которая может достигать более 92% точности, полноты и значения F в корпусе Пекинского университета и более 96% в корпусе Microsoft. Эффект.
Часть 1 Инструкции по установке набора инструментов условной модели случайного поля
В Mac OS или Linux исходный код C++ загружает установочный пакет (вотCRF++-0.58.tar.gz), выполните следующие действия для установки:
1. После входа в основной каталог кода обычно следуйте «configure & make & (sudo) make install, чтобы завершить установку библиотеки C++.
2. Перейдите в подкаталог python и установите пакет python: python setup.py build & (sudo) python setup.py install, эта библиотека python построена с помощью мощногоSWIGСгенерировано.
3. После завершения установки вы можете протестировать в интерпретаторе python, чтобы увидеть, можно ли успешно импортировать CRFPP, если все в порядке, он готов к работе.
Примечание. Во время процесса установки или во время выполнения процесса (когда я забыл), если сообщается о следующей ошибке:
ImportError: libcrfpp.so.0: cannot open shared object file: No such file or directory
Причина ошибки в том, что не удалось импортировать библиотеку libcrfpp.so.0, а файл библиотеки оказался существующим, поэтому ссылка была установлена:
32-битная система ln -s /usr/local/lib/libcrfpp.so.* /usr/lib/
64-битная система ln -s /usr/local/lib/libcrfpp.so.* /usr/lib64/
проблема решена.
Вторая часть знакомит со знаниями, связанными с моделью
В примере CRF++ есть каталог seg, который соответствует примеру сегментации японских слов, который можно применить к нашей сегментации китайских слов. В каталоге инсталляционного пакета, после выполнения команд cd example и cd seg, после перехода в каталог seg обнаруживается наличие 4 файлов:
exec.sh (выполнить скрипт)
шаблон (шаблон функции)
test.data (набор тестов)
train.data (тренировочный набор)
С этими 4 файлами то, что мы можем сделать, относительно просто, если данные подготовлены в формате тестового набора и обучающего набора, и можно применить шаблон функции и сценарий выполнения, но вот краткая интерпретация этих файлы CRF++. Первый взгляд на тренировочный набор:
毎 k B
日 k I
新 k I
聞 k I
社 k I
特 k B
別 k I
顧 k B
問 k I
4 n B
Здесь первый столбец представляет собой сегментируемый текст на японском языке, второй столбец на данный момент считается тегом части речи, а третий столбец представляет собой тег 2-tag(B, I) в слове тег, это очень важно, для обучающей выборки нам нужно подготовить , в основном, чтобы хорошо разметить этот столбец, но следует отметить, что сегментация производится пустыми строками.
Давайте посмотрим на формат тестового набора:
よ h I
っ h I
て h I
私 k B
た h B
ち h I
の h B
世 k B
代 k I
が h B
Есть также 3 столбца, первый столбец — это текст на японском языке, второй столбец и третий столбец аналогичны приведенным выше, но третий столбец в тестовом наборе в основном является заполнителем. На самом деле CRF++ предъявляет более гибкие требования к форматам файлов обучающей и тестовой выборок: во-первых, требуется несколько столбцов, но они не могут быть несовместимы, в файле некоторые строки представляют собой два столбца, а некоторые строки — три столбца, во-вторых, первый столбец представляет собой «слово или слово», которое необходимо пометить, а последний столбец — это выходной бит «метка тега». Если есть дополнительные функции, такие как часть речи или что-то еще, их можно добавить в середину столбец, чтобы в обучающем или тестовом наборе было наименьшее количество файлов. Должно быть два столбца.
Далее давайте подробно проанализируем файл шаблона объекта:
# Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-2,0]/%x[-1,0]/%x[0,0]
U06:%x[-1,0]/%x[0,0]/%x[1,0]
U07:%x[0,0]/%x[1,0]/%x[2,0]
U08:%x[-1,0]/%x[0,0]
U09:%x[0,0]/%x[1,0]
# Bigram
B
Описание и примеры шаблонов функций в CRF++ см. в разделе "Preparing feature templates
", а в следующих разделах в качестве примера используются приведенные выше данные сегментации японских слов. В файле шаблона объекта каждая строка (например, U00:%x[-2,0]) представляет объект, а макрос "%x [позиция строки, позиция столбца]» представляет смещение строки и абсолютное положение столбца относительно текущего указываемого маркера. Взяв в качестве примера приведенный выше обучающий набор, если в настоящее время сканируется строка «нового k I»,
毎 k B
日 k I
新 k I <== 扫描到这一行,代表当前位置
聞 k I
社 k I
特 k B
別 k I
顧 k B
問 k I
4 n B
Затем объекты, извлеченные в соответствии с файлом шаблона объектов, выглядят следующим образом:
# Unigram
U00:%x[-2,0] ==> 毎
U01:%x[-1,0] ==> 日
U02:%x[0,0] ==> 新
U03:%x[1,0] ==> 聞
U04:%x[2,0] ==> 社
U05:%x[-2,0]/%x[-1,0]/%x[0,0] ==> 每/日/新
U06:%x[-1,0]/%x[0,0]/%x[1,0] ==> 日/新/聞
U07:%x[0,0]/%x[1,0]/%x[2,0] ==> 新/聞/社
U08:%x[-1,0]/%x[0,0] ==> 日/新
U09:%x[0,0]/%x[1,0] ==> 新/聞
# Bigram
B
В CRF++ функции делятся на два типа: один — Unigram, начинающийся с «U», а другой — «Bigram», начинающийся с «B». Для функций Unigram, если шаблон функции «U01:%x[-1,0]», CRF++ автоматически сгенерирует набор функций функций (func1 … funcN):
func1 = if (output = B and feature="U01:日") return 1 else return 0
func2 = if (output = I and feature="U01:日") return 1 else return 0
....
funcXX = if (output = B and feature="U01:問") return 1 else return 0
funcXY = if (output = I and feature="U01:問") return 1 else return 0
Количество сгенерированных функций признаков = (L * N), где L — количество типов вывода, здесь — два тега B, I, а N — количество всех одиночных строк (признаков), расширенных через шаблон, который ссылается на японские иероглифы (признаки), обнаруженные при сканировании всех обучающих наборов.
Функция биграммы — это в основном набор функций биграммы, созданный путем автоматической комбинации текущего токена и токена предыдущей позиции. Наконец, следует отметить, что флаговые биты U01 и U02 в сочетании с токеном функции в основном различают функции «U01: спросить» и «U02: спросить», хотя извлеченные функции «слова» на японском языке одинаковы, но in Это отличительная черта CRF++.
Наконец, давайте взглянем на скрипт выполнения:
#!/bin/sh
../../crf_learn -f 3 -c 4.0 template train.data model
../../crf_test -m model test.data
../../crf_learn -a MIRA -f 3 template train.data model
../../crf_test -m model test.data
rm -f model
Сценарий выполнения говорит нам, как обучить модель CRF и как использовать эту модель для тестирования.После выполнения этого сценария для входного набора тестов выходным результатом является еще один столбец:
よ h I B
っ h I I
て h I B
私 k B B
た h B B
ち h I I
の h B B
世 k B B
代 k I I
が h B B
И этот столбец является тегом измененного слова, предсказанного моделью, что и является нужным нам результатом. На данный момент введение примеров сегментации японских слов завершено, читатели должны догадаться, как мы будем делать сегментацию китайских слов дальше, верно?
Часть III Практика сегментации китайских слов
1. Преобразование обучающих данных в backoff2005 в формат обучающих данных, требуемый CRF++.Корпус выбирается из корпуса «Жэньминь жибао» Пекинского университета с использованием 4-тегов ( B (начало слова), E ( Конец, конец слова) ), M (середина, слово), S (одиночное, отдельное слово)) набор тегов, обработка текста в кодировке utf-8.
Форма оригинального тренировочного набора ./icwb2-data/training/pku_training.utf8 - это форма китайского предложения искусственно секретных слов. Согласно следующему сценарию make_train.py, конвертировать этот тренировочный корпус в формат корпуса для обучения CRF ++ (2 столбца, 4-метка):
#!/usr/bin/env python
#-*-coding:utf-8-*-
#4-tags for character tagging: B(Begin),E(End),M(Middle),S(Single)
import codecs
import sys
def character_tagging(input_file, output_file):
input_data = codecs.open(input_file, 'r', 'utf-8')
output_data = codecs.open(output_file, 'w', 'utf-8')
for line in input_data.readlines():
word_list = line.strip().split()
for word in word_list:
if len(word) == 1:
output_data.write(word + "\tS\n")
else:
output_data.write(word[0] + "\tB\n")
for w in word[1:len(word)-1]:
output_data.write(w + "\tM\n")
output_data.write(word[len(word)-1] + "\tE\n")
output_data.write("\n")
input_data.close()
output_data.close()
if __name__ == '__main__':
if len(sys.argv) != 3:
print ("Usage: python " + argv[0] + " input output")
sys.exit(-1)
input_file = sys.argv[1]
output_file = sys.argv[2]
character_tagging(input_file, output_file)
Пример результата (при условии, что имя файла pku_training_tag.utf8, которое будет использоваться позже) выглядит следующим образом:
“ S
人 B
们 E
常 S
说 S
生 B
活 E
是 S
一 S
部 S
...
2. С этим учебным корпусом вы можете использовать обучающий инструмент crf crf_learn для обучения модели, выполнив следующую команду: crf_learn -f 3 -c 4.0 template pku_training_tag.utf8 crf_model
Время обучения чуть больше, на моей машине с памятью 2G оно длилось около 567 раундов, около 21 часа, а финальная тренировочная crf_model составляет около 37M. Теперь с моделью нам нужно подготовить тестовый корпус для CRF++, а затем использовать тестовый инструмент CRF++ crf_test для маркировки слов. Исходный тестовый корпус — icwb2-data/testing/pku_test.utf8 Следующий скрипт преобразует тестовый корпус в формат, требуемый моделью (см. введение во второй части), и отображает сегментированные файлы. Сценарий выглядит следующим образом:
#!/usr/bin/env python
#-*-coding:utf-8-*-
#CRF Segmenter based character tagging:
# 4-tags for character tagging: B(Begin), E(End), M(Middle), S(Single)
import codecs
import sys
import CRFPP
def crf_segmenter(input_file, output_file, tagger):
input_data = codecs.open(input_file, 'r', 'utf-8')
output_data = codecs.open(output_file, 'w', 'utf-8')
for line in input_data.readlines():
tagger.clear()
for word in line.strip():
word = word.strip()
if word:
tagger.add((word + "\to\tB").encode('utf-8'))
tagger.parse()
size = tagger.size()
xsize = tagger.xsize()
for i in range(0, size):
for j in range(0, xsize):
char = tagger.x(i, j).decode('utf-8')
tag = tagger.y2(i)
if tag == 'B':
output_data.write(' ' + char)
elif tag == 'M':
output_data.write(char)
elif tag == 'E':
output_data.write(char + ' ')
else:
output_data.write(' ' + char + ' ')
output_data.write('\n')
input_data.close()
output_data.close()
if __name__ == '__main__':
if len(sys.argv) != 4:
print "Usage: python " + sys.argv[0] + " model input output"
sys.exit(-1)
crf_model = sys.argv[1]
input_file = sys.argv[2]
output_file = sys.argv[3]
tagger = CRFPP.Tagger("-m " + crf_model)
crf_segmenter(input_file, output_file, tagger)
Четвертая часть результатов сегментации слов
С результатом сегментации слов, помеченных словами CRF, мы можем использовать тестовый сценарий backoff2005, чтобы проверить эффект этой сегментации слов:
./icwb2-data/scripts/score ./icwb2-data/gold/pku_training_words.utf8 ./icwb2-data/gold/pku_test_gold.utf8 pku_result.utf8 > pku_result.score
Примечание:
pku_result.utf8 — окончательный файл результатов сегментации слов.
Результат выглядит следующим образом:
Как видно из приведенного выше рисунка, точность сегментации слов CRF составляет 93,7%, а скорость отзыва — 92,3%.
Справочная статья:www.52nlp.cn/Учебник по сегментации китайских слов: метод записи слов…