Python中文自然语言处理:一、基础文本处理(转载)
对中文进行分词
import jieba
text = '你好,我正在进行Python自然语言处理,有些问题需要处理,笑哈哈'
word = jieba.cut(text)
word_list = ' '.join(word).split(' ')
print(word_list)
输出:
['你好', ',', '我', '正在', '进行', 'Python', '自然语言', '处理', ',', '有些', '问题', '需要', '处理', ',', '笑哈哈']
去除文本中的标点符号
import re
reg = r"[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+"
for i in word_list:
result = re.match(reg,i)
if result != None:
word_list.remove(i)
print(word_list)
输出:
['你好', '我', '正在', '进行', 'Python', '自然语言', '处理', '有些', '问题', '需要', '处理', '笑哈哈']
生成一个单词的起始位置
text_no_punp = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+", "",text)
print(list(jieba.tokenize(text_no_punp)))
输出:
[('你好', 0, 2), ('我', 2, 3), ('正在', 3, 5), ('进行', 5, 7), ('Python', 7, 13), ('自然语言', 13, 17), ('处理', 17, 19), ('有些', 19, 21), ('问题', 21, 23), ('需要', 23, 25), ('处理', 25, 27), ('笑哈哈', 27, 30)]
去除重复词
class RepeatReplacer(object):
def __init__(self):
self.repeat_regexp = re.compile(r'(\w*)(\w)\2(\w*)')
self.repl = r'\1\2\3'
def replace(self,word):
repl_word = self.repeat_regexp.sub(self.repl,word)
if repl_word != word:
return self.replace(repl_word)
else:
return repl_word
replacer = RepeatReplacer()
replacer.replace("高高兴兴")
输出:
'高兴'
对文本应用Zipf定律
import nltk
from nltk.corpus import brown
from nltk.probability import FreqDist
import matplotlib
import matplotlib.pyplot as plt
# 解决中文和负号显示
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
matplotlib.use('MacOSX')
fd = FreqDist()
for text in gutenberg.fileids():
for word in gutenberg.words(text):
fd[word]+= 1
ranks = []
freqs = []
for rank, word in enumerate(fd):
ranks.append(rank+1)
freqs.append(fd[word])
plt.figure(figsize=(15,8))
plt.loglog(ranks,freqs,'.-')
plt.xlabel('词频(f)', fontsize=14, fontweight='bold')
plt.ylabel('排名(r)', fontsize=14, fontweight='bold')
plt.grid(True)
plt.show()
![](http://upload-images.jianshu.io/upload_images/38544-6155da57de69435a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
相似性度量
from nltk.metrics import *
text1 = '你好,我正在使用Python自然语言处理,有些问题正在处理,嘿嘿'
word1 = jieba.cut(text1)
word_list1 = ' '.join(word1).split(' ')
# print(word_list1)
for i in word_list1:
result = re.match(reg,i)
if result != None:
word_list1.remove(i)
print(word_list)
print(word_list1)
# 准确性度量
print(accuracy(word_list,word_list1))
# Jaccard相似系数度量
print(jaccard_distance(set(word_list),set(word_list1)))
# MASI距离度量
print(masi_distance(set(word_list),set(word_list1)))
# 二值距离度量
print(binary_distance(set(word_list),set(word_list1)))
输出:
['你好', '我', '正在', '进行', 'Python', '自然语言', '处理', '有些', '问题', '需要', '处理', '笑哈哈']
['你好', '我', '正在', '使用', 'Python', '自然语言', '处理', '有些', '问题', '正在', '处理', '嘿嘿']
0.75
0.38461538461538464
0.12692307692307692
1.0
文章版权所有:州的先生博客,转载必须保留出处及原文链接
(例子未通过)