Сегментация китайских слов Python jieba 15 минут, вход и продвинутый уровень

искусственный интеллект Python GitHub Jieba

Общее введение

jieba – это инструмент для сегментации китайских слов на основе Python. Его очень удобно устанавливать и использовать. Вы можете просто использовать pip напрямую. Можно использовать 2/3. Он обладает мощными функциями и настоятельно рекомендуется блоггерами.
github:github.com/fxsjy/jieba
Адрес с открытым исходным кодом в Китае:Woohoo.OSCHINA.net/Fear/Street Fighter/?
На написание этой статьи уйдет два часа, а на чтение — пятнадцать.После прочтения этой статьи вы сможете начать работу с jieba.

В следующем сообщении блога будет представлено создание облаков китайских слов из любого китайского текста.

В то же время, если вы хотите использовать другие инструменты сегментации слов, то можете обратить внимание на мой будущий блог, в ближайшие дни я опубликую другой связанный контент.

Три режима сегментации слов с одним параметром

Следующий код в основном взят с github jieba, вы можете скачать исходный код на github.

import jieba

seg_list = jieba.cut("我来到北京清华大学", cut_all=True, HMM=False)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式

seg_list = jieba.cut("我来到北京清华大学", cut_all=False, HMM=True)
print("Default Mode: " + "/ ".join(seg_list))  # 默认模式

seg_list = jieba.cut("他来到了网易杭研大厦", HMM=False)
print(", ".join(seg_list))

seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造", HMM=False)  # 搜索引擎模式
print(", ".join(seg_list))

# jieba.cut的默认参数只有三个,jieba源码如下
# cut(self, sentence, cut_all=False, HMM=True)
# 分别为:输入文本 是否为全模式分词 与是否开启HMM进行中文分词

分词模式的运行结果

извлечение ключевых слов

from os import path
import jieba.analyse as analyse

d = path.dirname(__file__)

text_path = 'txt/lz.txt' #设置要分析的文本路径
text = open(path.join(d, text_path)).read()

for key in analyse.extract_tags(text,50, withWeight=False):
# 使用jieba.analyse.extract_tags()参数提取关键字,默认参数为50
    print key.encode('utf-8')
    # 设置输出编码为utf-8不然在因为win下控制台默认中文字符集为gbk,所以会出现乱码
    # 当withWeight=True时,将会返回number类型的一个权重值(TF-IDF)

提取关键词的运行效果

Результат работы показан на рисунке, но мы также обнаружили некоторые проблемы, такие как:
Вопрос один:
Сегментация слова неверна. В текущих результатах «Лу Минфэй» (главный герой-Дракон) делится на китайские слова «Лу Мин» и «Мингфэй», потому что тезаурус Цзебы не содержит этого слова. , по той же причине а тезаурус jieba относительно старый, так что это происходит во многих сегментациях текста, и мы решим эту проблему в пятом модуле "Три способа сделать сегментацию слов более точной"
Вопрос второй:
Когда есть несущественные слова, независимо от того, на каком языке будет большое количество несущественных слов.Нам нужно удалить стоп-слова при выполнении сегментации китайских слов.Эта проблема будет решена в следующем модуле.

Проверка китайской двусмысленности и удаление стоп-слов

Этот код в основном взят из «Практического руководства по машинному обучению (второе издание)», его автором является Май Хао, ps: это хорошая книга.

import jieba
TestStr = "2010年底部队友谊篮球赛结束"
# 因为在汉语中没有空格进行词语的分隔,所以经常会出现中文歧义,比如年底-底部-部队-队友
# jieba 默认启用了HMM(隐马尔科夫模型)进行中文分词,实际效果不错

seg_list = jieba.cut(TestStr, cut_all=True)
print "Full Mode:", "/ ".join(seg_list) # 全模式

seg_list = jieba.cut(TestStr, cut_all=False)
print "Default Mode:", "/ ".join(seg_list) # 默认模式
# 在默认模式下有对中文歧义有较好的分类方式

seg_list = jieba.cut_for_search(TestStr) # 搜索引擎模式
print "cut for Search","/".join(seg_list)

中文歧义测试

Удалить стоп-слова из текста

# - * - coding: utf - 8 -*-
#
# 作者:田丰(FontTian)
# 创建时间:'2017/5/27'
# 邮箱:fonttian@163.com
# CSDN:http://blog.csdn.net/fontthrone

import sys
import jieba
from os import path

d = path.dirname(__file__)
stopwords_path = 'stopwords\stopwords1893.txt' # 停用词词表

text_path = 'txt/lz.txt' #设置要分析的文本路径
text = open(path.join(d, text_path)).read()

def jiebaclearText(text):
    mywordlist = []
    seg_list = jieba.cut(text, cut_all=False)
    liststr="/ ".join(seg_list)
    f_stop = open(stopwords_path)
    try:
        f_stop_text = f_stop.read( )
        f_stop_text=unicode(f_stop_text,'utf-8')
    finally:
        f_stop.close( )
    f_stop_seg_list=f_stop_text.split('\n')
    for myword in liststr.split('/'):
        if not(myword.strip() in f_stop_seg_list) and len(myword.strip())>1:
            mywordlist.append(myword)
    return ''.join(mywordlist)

text1 = jiebaclearText(text)
print text1

龙族中文分词去除中文停用词后的效果

Три способа сделать сегментацию слов более точной

Вариант 1, добавить китайские слова в цзеба: этот метод может эффективно решить ситуацию, когда главный герой-мужчина дракона «Лу Минфэй» раньше был разделен на два слова «Лу Мин» и «Мингфэй».

#这个只需要在源代码中加入一个语句即可
import sys
import jieba
from os import path

d = path.dirname(__file__)
stopwords_path = 'stopwords\stopwords1893.txt' # 停用词词表

jieba.add_word('路明非')
# 添加的自定义中文语句的代码在这里
# 添加的自定义中文语句的代码在这里
# 添加的自定义中文语句的代码在这里

text_path = 'txt/lz.txt' #设置要分析的文本路径
text = open(path.join(d, text_path)).read()

def jiebaclearText(text):
    mywordlist = []
    seg_list = jieba.cut(text, cut_all=False)
    liststr="/ ".join(seg_list)
    f_stop = open(stopwords_path)
    try:
        f_stop_text = f_stop.read( )
        f_stop_text=unicode(f_stop_text,'utf-8')
    finally:
        f_stop.close( )
    f_stop_seg_list=f_stop_text.split('\n')
    for myword in liststr.split('/'):
        if not(myword.strip() in f_stop_seg_list) and len(myword.strip())>1:
            mywordlist.append(myword)
    return ''.join(mywordlist)

text1 = jiebaclearText(text)
print text1

Эффект операции следующий:
添加自定义语句之后

Вариант 2, добавьте пользовательский тезаурус: следующий код в основном взят из исходного кода jieba на github, вы можете скачать пример на github.

#encoding=utf-8
from __future__ import print_function, unicode_literals
import sys
sys.path.append("../")
import jieba
jieba.load_userdict("userdict.txt")
# jieba采用延迟加载,"import jieba"不会立即触发词典的加载,一旦有必要才开始加载词典构建trie。如果你想手工初始jieba,也可以手动初始化。示例如下:
# import jieba
# jieba.initialize() #手动初始化(可选)
# 在0.28之前的版本是不能指定主词典的路径的,有了延迟加载机制后,你可以改变主词典的路径:
# 注意用户词典为主词典即优先考虑的词典,原词典此时变为非主词典
# jieba.set_dictionary('data/dict.txt.big')

import jieba.posseg as pseg

test_sent = (
"李小福是创新办主任也是云计算方面的专家; 什么是八一双鹿\n"
"例如我输入一个带“韩玉赏鉴”的标题,在自定义词库中也增加了此词为N类\n"
"「台中」正確應該不會被切開。mac上可分出「石墨烯」;此時又可以分出來凱特琳了。"
)
words = jieba.cut(test_sent)
print('/'.join(words))

print("="*40)

result = pseg.cut(test_sent)
# pseg.cut 切分,并显示词性
# 下面是userdict.txt的内容,如果不加入这个词库,那么在运行结果中,云计算,创新办等词都将无法识别
'''
云计算 5
李小福 2 nr
创新办 3 i
easy_install 3 eng
好用 300
韩玉赏鉴 3 nz
八一双鹿 3 nz
台中
凱特琳 nz
Edu Trust认证 2000
'''

添加用户词典

Следующий код в основном взят с github jieba, вы можете скачать исходный код на github.

print('='*40)
print('添加自定义词典/调整词典')
print('-'*40)

print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
#如果/放到/post/中将/出错/。
# 调整词典使 中将 变为中/将
print(jieba.suggest_freq(('中', '将'), True))
#494
print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
#如果/放到/post/中/将/出错/。
print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
#「/台/中/」/正确/应该/不会/被/切开
print(jieba.suggest_freq('台中', True))
print(jieba.suggest_freq('台中', True))
#69
# 调整词典使 台中 不被分词为台/中
print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
#「/台中/」/正确/应该/不会/被/切开

Параллельные вычисления

Следующий код в основном взят с github jieba, вы можете скачать исходный код на github.

Принцип: после разделения целевого текста по строкам назначьте каждую строку текста нескольким процессам Python для параллельной сегментации слов, а затем объедините результаты, чтобы получить значительное улучшение скорости сегментации слов.

На основе многопроцессорного модуля, который поставляется с Python, в настоящее время не поддерживает окна.

import sys
import time
sys.path.append("../../")
import jieba

jieba.enable_parallel() # 关闭并行分词
jieba.enable_parallel(4) # 开启并行分词模式,参数为并行进程数 

url = sys.argv[1]
content = open(url,"rb").read()
t1 = time.time()
words = "/ ".join(jieba.cut(content))

t2 = time.time()
tm_cost = t2-t1

log_f = open("1.log","wb")
log_f.write(words.encode('utf-8'))

print('speed %s bytes/second' % (len(content)/tm_cost))

Экспериментальные результаты: на 4-ядерном компьютере с тактовой частотой 3,4 ГГц точная сегментация слов полного собрания сочинений Цзинь Юна достигла скорости 1 МБ/с, что в 3,3 раза больше, чем в однопроцессорной версии.