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











posted @ 2018-12-12 09:55  慕云深  阅读(664)  评论(0)    收藏  举报