NLTK的学习(一)
(一)tokenization的三种方式
import nltk
text = "This is Andrew's text, isn't it?"
tokenizer = nltk.tokenize.WhitespaceTokenizer()
tokenizer.tokenize(text) #特点 : isn't 不变
tokenizer = nltk.tokenize.TreebankWordTokenizer()
tokenizer.tokenize(text) #isn't -> is n't , Andrew's-> Andrew 's
tokenizer = nltk.tokenize.WordPunctTokenizer()
tokenizer.tokenize(text)#isn't-> isn ' t Andrew's-> Andrew ' s 全分开
(二)steming 词干提取
NLTK中提供了三种最常用的词干提取器接口,即 Porter stemmer, Lancaster Stemmer 和 Snowball Stemmer。
import nltk
text = "feet wolves cats talked"
tokenizer = nltk.tokenize.TreebankWordTokenizer()
tokens = tokenizer.tokenize(text)
stemmer = nltk.stem.PorterStemmer()
" ".join(stemmer.stem(token) for token in tokens)
output:
'feet wolv cat talk'
'''Lemmatisation是把一个任何形式的语言词汇还原为一般形式(能表达完整语义)。相对而言,词干提取是简单的轻量级的词形归并方式,
最后获得的结果为词干,并不一定具有实际意义。词形还原处理相对复杂,获得结果为词的原形,能够承载一定意义,与词干提取相比,更具有研究和应用价值。'''
stemmer = nltk.stem.WordNetLemmatizer()#词性还原
" ".join(stemmer.lemmatize(token) for token in tokens)
output:
'foot wolf cat talked'
在学习的过程中发现WordNetLemmatizer的切分功能
from nltk.stem import WordNetLemmatizer
from nltk.corpus import words
wordlist = set(words.words())
wordnet_lemmatizer = WordNetLemmatizer()
s1='theyarebirds'
def max_match(text):
pos2 = len(text)
result = ''
while len(text) > 0:
word = wordnet_lemmatizer.lemmatize(text[0:pos2])
print(word)
if word in wordlist:
result = result + text[0:pos2] + ' '
text = text[pos2:]
pos2 = len(text)
else:
pos2 = pos2 - 1
return result[0:-1]
print(max_match(s1))
注意输出结果:
theyarebirds
theyarebird
theyarebir
theyarebi
theyareb
theyare
theyar
theya
they
arebirds
arebird
arebir
arebi
areb
are
bird
they are birds
显然是最大匹配原则
最大匹配算法(MaxMatch)
MaxMatch算法在中文自然语言处理中常常用来进行分词(或许从名字上你已经能想到它是基于贪婪策略设计的一种算法)。通常,英语中一句话里的各个词汇之间通过空格来分割,这是非常straightforward的,但是中文却没有这个遍历。例如“我爱中华人民共和国”,这句话被分词的结果可能是这样的{‘我’,‘爱’,‘中华’,‘人民’,‘共和国’},又或者是{‘我’,‘爱’,‘中华人民共和国’},显然我们更倾向于后者的分词结果。因为‘中华人民共和国’显然是一个专有名词(把这样一个词分割来看显然并不明智)。我们选择后者的策略就是所谓的MaxMatch,即最大匹配。因为‘中华人民共和国’这个词显然要比‘中华’,‘人民’,‘共和国’这些词都长。
---------------------
作者:白马负金羁
来源:CSDN
原文:https://blog.csdn.net/baimafujinji/article/details/51069522
(三)TF-ITF 词频与逆向文件频率即: tf*itf 而tf为词条w的频率,itf=log(总文档数/含词条w的文档数)
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
texts = [
"good movie", "not a good movie", "did not like",
"i like it", "good one"
]
# using default tokenizer in TfidfVectorizer
tfidf = TfidfVectorizer(min_df=2, max_df=0.5, ngram_range=(1, 2))
features = tfidf.fit_transform(texts)
pd.DataFrame(
features.todense(),
columns=tfidf.get_feature_names()
)
output:

NLTK学习的第一周总结:
学习的data是tsv文档类型,了解了一下:
TSV 是Tab-separated values的缩写,即制表符分隔值。
相对来说CSV,Comma-separated values(逗号分隔值)更常见一些。
def read_data(filename):#构建了一个read_data函数,完成 '\t’ 分隔符的文件读取, 并且对tags数据进行了literal_eval操作
data = pd.read_csv(filename, sep='\t')
data['tags'] = data['tags'].apply(literal_eval)
return data
train = read_data('data/train.tsv')
validation = read_data('data/validation.tsv')
test = pd.read_csv('data/test.tsv', sep='\t')
literal_eval操作,将源文件中的列表中的字符串数据改变了:
title tags
How to draw a stacked dotplot in R? ['r']
mysql select all records where a datetime field is less than a specified value ['php', 'mysql']
How to terminate windows phone 8.1 app ['c#']

对语料数据进行正则处理:
REPLACE_BY_SPACE_RE = re.compile('[/(){}\[\]\|@,;]')
BAD_SYMBOLS_RE = re.compile('[^0-9a-z #+_]')
STOPWORDS = set(stopwords.words('english'))
def text_prepare(text):
"""
text: a string
return: modified initial string
"""
text = text.lower()# lowercase text
text = re.sub(REPLACE_BY_SPACE_RE,' ', text)# replace REPLACE_BY_SPACE_RE symbols by space in text
text = re.sub(BAD_SYMBOLS_RE,'', text)# delete symbols which are in BAD_SYMBOLS_RE from text
text = ' '.join([w for w in text.split() if w not in STOPWORDS])# delete stopwords from text 注意list->str 的join的方法以及,for与if的连用
return text

浙公网安备 33010602011771号