⾃然语⾔处理中的⽂本处理和特征⼯程
机器之⼼报道
⽂本处理
现有数据中,⽂本是最⾮结构化的形式,⾥⾯有各种各样的噪声;如果没有预处理,⽂本数据都不能分析。清理和标准化⽂本的整个过程叫做⽂本预处理(textpreprocessing),其作⽤是使⽂本数据没有噪声并且可以分析。
主要包括三个步骤:
移除噪声词汇规范化对象标准化
下图展⽰了⽂本预处理流程的结构。
移除噪声
任何与数据上下⽂和最终输出⽆关的⽂本都可被判作噪声。
例如,语⾔停⽌词(stopword,语⾔中常⽤的词汇:系动词is,am,定冠词the,介词of,in)、URL或链接、社交媒体实体(提及、标签)、标点符号和特定⾏业词汇。这⼀步移除了⽂本中所有类型的噪声。
移除噪声通⽤的做法是准备⼀个噪声实体的词典,在⽂本对象上逐个token(或逐词)迭代,消除在噪声词典中出现的标签。
以下是实现这⼀步的Python代码:
```
#Samplecodetoremovenoisywordsfromatext
noise_list=["is","a","this","..."]
def_remove_noise(input_text):
words=input_text.split()
noise_free_words=[wordforwordinwordsifwordnotinnoise_list]
noise_free_text="".join(noise_free_words)
returnnoise_free_text
_remove_noise("thisisasampletext")
>>>"sampletext"
以下是从输⼊⽂本中移除正则表达式的Python代码:
#Samplecodetoremovearegexpattern
importre
def_remove_regex(input_text,regex_pattern):
urls=re.finditer(regex_pattern,input_text)
foriinurls:
input_text=re.up().strip(),'',input_text)
returninput_text
regex_pattern="#[A-Za-z0-9\w]*"
_remove_regex("removethis#hashtagfromanalyticsvidhya",regex_pattern)
>>>"removethisfromanalyticsvidhya"
词汇规范化
另外⼀种⽂本形式的噪声是由⼀个词汇所产⽣的多种表⽰形式。
例如,“play”,“player”,“played”,“plays”和“playing”,这些词汇都是由“play”变化⽽来的。虽然它们意义不⼀,但根据上下⽂都是相似的。词汇规范化这⼀步把⼀个词的不同展现形式转化为了他们规范化的形式(也叫做引理(lemma))。规范化是⽂本上的特征⼯程起中枢作⽤的⼀步,因为它把⾼维特征(N个不同的特征)转化为了对任何机器学习模型都很理想的低维空间(1个特征)。
最常见的词汇规范化是:
词⼲提取:词⼲提取是词汇后缀(“ing”,“ly”,“es”,“s”等)去除过程的⼀个基本规则。词形还原:词形还原与词⼲提取相反,是有组织地逐步获取词汇根形式的步骤,它使⽤到了词汇(词汇字典序)和形态分析(词的结构和语法关系)。
下⾯是实现词形还原和词⼲提取的代码,使⽤了⼀个流⾏的Python库NLTK:
fromnltk.stem.wordnetimportWordNetLemmatizer
lem=WordNetLemmatizer()
fromnltk.stem.porterimportPorterStemmer
stem=PorterStemmer()
word="multiplying"
lem.lemmatize(word,"v")
>>"multiply"
stem.stem(word)
>>"multipli"
对象标准化
⽂本数据经常包含不在任何标准词典⾥出现的词汇或短语。搜索引擎和模型都识别不了这些。
⽐如,⾸字母缩略词、词汇附加标签和通俗俚语。通过正则表达式和⼈⼯准备的数据词典,这种类型的噪声可以被修复。以下代码使⽤了词典查⽅法来替代⽂本中的社交俚语。
lookup_dict={'rt':'Retweet','dm':'directmessage',"awsm":"awesome","luv":"love","..."}
def_lookup_words(input_text):
new_words=[]
forwordinwords:
ifword.lower()inlookup_dict:
word=lookup_dict[word.lower()]
new_words.append(word)new_text="".join(new_words)
returnnew_text
_lookup_words("RTthisisaretweetedtweetbyShivamBansal")
>>"RetweetthisisaretweetedtweetbyShivamBansal"
除了⽬前为⽌讨论过的三个步骤,其他类型的⽂本预处理有编码-解码噪声,语法检查器和拼写改正等。我之前的⼀篇⽂章给出了预处理及其⽅法的细节。
⽂本到特征(⽂本数据上的特征⼯程)
为了分析已经预处理过的数据,需要将数据转化成特征(feature)。取决于⽤途,⽂本特征可通过句法分析、实体/N元模型/基于词汇的特征、统计特征和词汇嵌⼊等⽅法来构建。下⾯来详细理解这些技巧。
句法分析
句法分析涉及到对句中词的语法分析和位置与词汇的关系的分析。依存语法(DependencyGrammar)和词性标注(PartofSpeechtags)是重要的⽂本句法属性。
依赖树(DependencyTrees)——由⼀些词汇共同组成的句⼦。句中词与词之间的联系是由基本的依存语法决定的。从属关系语法是⼀类解决(已标签)两个词汇项(字词)间⼆元不对称关系的句法⽂本分析。每⼀种关系都可⽤三元组(关系、⽀配成分、从属成分)来表⽰。例如:考虑下⾯这个句⼦:“BillsonportsandimmigrationweresubmittedbySenatorBrownback,RepublicanofKansas.”词汇间的关系可由如下所⽰的树的形式观察得到
观察树的形状可得:“submitted”是该句的根词(rootword),由两颗⼦树所连接(主语和宾语⼦树)。每⼀颗⼦树本⾝⼜是⼀颗依存关系树(dependencytree),其中的关系⽐如有-(“Bills”<->“ports”“proposition”关系),(“ports”<->“immigration”“conjugation”关系)
词性标注(PoS/Partofspeechtagging)——除了语法关系外,句中每个词都与词性(名词、动词、形容词、副词等等)联系起来。词性标注标签决定了句中该词的⽤法和作⽤。这⾥有宾⼣法尼亚⼤学定义的所有可能的词性标签表。以下代码使⽤了NTLK包对输⼊⽂本执⾏词性标签注释。(NTLK提供了不同的实现⽅式,默认是感知器标签)
fromnltkimportword_tokenize,pos_tag
text="IamlearningNaturalLanguageProcessingonAnalyticsVidhya"
tokens=word_tokenize(text)
printpos_tag(tokens)
>>>[('I','PRP'),('am','VBP'),('learning','VBG'),('Natural','NNP'),('Language','NNP'),
('Processing','NNP'),('on','IN'),('Analytics','NNP'),
词性标注被⽤在许多重要的⾃然语⾔处理⽬的上:
A.词义消歧:⼀些词汇根据⽤法有很多种意思。例如,下⾯的两个句⼦:
I.“PleasebookmyflightforDelhi”II.“Iamgoingtoreadthisbookintheflight”
“Book”在不同的上下⽂中出现,然⽽这两种情况的词性标签却不⼀样。在第⼀句中,“book”被⽤作动词,⽽在第⼆句中,它被⽤作名词。(Lesk算法也可被⽤于相同的⽬的)
B.提⾼基于词汇的特征:当词汇作为特征时,⼀个学习模型可以学习到不同的词汇上下⽂,然⽽特征与词性连接起来,上下⽂就被保留了,因此得到了很强的特征。例如:
句-“bookmyflight,Iwillreadthisbook”标签–(“book”,2),(“my”,1),(“flight”,1),(“I”,1),(“will”,1),(“read”,1),(“this”,1)带有POS的标签–(“book_VB”,1), (“my_PRP$”,1),(“flight_NN”,1),(“I_PRP”,1),(“will_MD”,1),(“read_VB”,1),(“this_DT”,1),(“book_NN”,1)
C.规范化和词形归并(Lemmatizatio):词性标签是将词转化为其基本形式(引理)的基础
D.⾼效移除停⽌词:词性标签在移除停⽌词⽅⾯也⾮常有⽤。
例如,有⼀些标签总是定义低频/较低重要性的词汇。
例如:(IN–“within”,“upon”,“except”),(CD–“one”,”two”,“hundred”),(MD–“may”,“must”等)
实体提取(实体作为特征)
实体(entity)被定义为句中最重要的部分——名词短语、动词短语或两者都有。实体检测算法通常是由基于规则的解析、词典查询、词性标签和依存分析组合起来的模型。实体检测的适⽤性很⼴泛,在⾃动聊天机器⼈、内容分析器和消费者见解中都有应⽤。
主题建模和命名实体识别是⾃然语⾔处理领域中两种关键的实体检测⽅法。
A.命名实体识别(NER/NamedEntityRecognition)
从⽂本中检测命名实体⽐如⼈名、位置、公司名称等的过程叫做命名实体识别(NER)。例如:
句-SergeyBrin,themanagerofGoogleInc.iswalkinginthestreetsofNewYork.命名实体-(“⼈”:“SergeyBrin”),(“公司名”:“GoogleInc.”),(“位
置”:“NewYork”)典型NER模型包含三个模块:
名词短语识别:使⽤从属关系分析和词性分析将所有名词性短语从⽂本中提取出来。短语分类:将提
取出的名词短语分类到各⾃的⽬录(位置,名称等)中。⾕歌地图API提供了通往消除歧义位置的很好路径。然后,dbpedia,的开源数据库可以⽤来识别⼈名或公司名。除了这个,我们能通过结合不同来源的信息精确的查表和词典。实体消歧:有些时候实体可能会误分类,因此在结果层上建⼀层交叉验证层⾮常有⽤。知识图谱就可以⽤来使⽤。⽬前流⾏的知识图谱有:⾕歌知识图谱、IBMWatson和。
B.主题建模
主题建模是⾃动识别⽂本集中主题的过程,它以⽆监督的⽅式从语料库中的词汇⾥提取隐藏的模式。主题(topic)被定义为“⽂本集中共同出现术语的重复模式”。⼀个好的主题模型能对“健康”、“医⽣”、“病⼈”、“医院”建模为“健康保健”,“农场”、“作物”、“⼩麦”建模为“耕作”。
doc1="Sugarisbadtoconsume.Mysisterlikestohavesugar,butnotmyfather."
doc2="Myfatherspendsalotoftimedrivingmysisteraroundtodancepractice."
random在python中的意思
doc3="Doctorssuggestthatdrivingmaycauseincreasedstressandbloodpressure."
doc_complete=[doc1,doc2,doc3]
doc_clean=[doc.split()fordocindoc_complete]
importgensimfromgensim
importcorpora
#Creatingthetermdictionaryofourcorpus,whereeveryuniquetermisassignedanindex.
dictionary=corpora.Dictionary(doc_clean)
#Convertinglistofdocuments(corpus)intoDocumentTermMatrixusingdictionarypreparedabove.
doc_term_matrix=[dictionary.doc2bow(doc)fordocindoc_clean]
#CreatingtheobjectforLDAmodelusinggensimlibrary
dels.ldamodel.LdaModel
#RunningandTrainingLDAmodelonthedocumenttermmatrix
ldamodel=Lda(doc_term_matrix,num_topics=3,id2word=dictionary,passes=50)
#Results
print(ldamodel.print_topics())
C.N-Grams特征
N-Grams是指N个词汇的结合体。N-Grams(N>1)作为特征与词汇(Unigrams)作为特征相⽐,通常会更加富含信息。同
时,bigrams(N=2)被认为是最重要的特征。以下代码⽣成了⽂本的bigrams。
defgenerate_ngrams(text,n):
words=text.split()
output=[]
foriinrange(len(words)-n+1):
output.append(words[i:i+n])
returnoutput
>>>generate_ngrams('thisisasampletext',2)
#[['this','is'],['is','a'],['a','sample'],,['sample','text']]

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。