【NLP】英文數據預處理___詞幹/詞元處理

目錄

簡介

異同

相同點

不同點

代碼

詞形還原

詞幹提取

Gensim_詞形還原

說明


簡介

詞形還原(Lemmatization):把一個任何形式的語言詞彙還原爲基本形式(能表達完整語義);

詞幹提取(Stemming):抽取詞的詞幹或詞根形式(不一定能夠表達完整語義);

二者都是詞形規範化的方式,都能夠達到有效歸併詞形的目的,二者既有聯繫也有區別。

 

異同

相同點

  • 處理目標一致——將詞的屈折形態或派生形態簡化或歸併爲詞幹(stem)或原形的基礎形式,都是一種對詞的不同形態的統一歸併的過程。
  • 主流實現方法類似——均是利用語言中存在的規則或詞典映射提取詞幹或獲得詞的原形。
  • 結果部分交叉——詞幹提取和詞形還原不是互斥關係,其結果有部分交叉。部分詞利用這兩類方法都能達到相同的詞形轉換效果。如“dogs”的詞幹爲“dog”,其原形(詞形還原)也爲“dog”。
  • 應用領域相似——主要應用於信息檢索和文本、自然語言處理等方面,二者均是這些應用的基本步驟。

不同點

  • 原理:詞幹提取主要是採用“縮減”的方法,將詞轉換爲詞幹,如將“cats”處理爲“cat”,將“effective”處理爲“effect”。而詞形還原主要採用“轉變”的方法,將詞轉變爲其原形,如將“drove”處理爲“drive”,將“driving”處理爲“drive”。
  • 實現方法:雖然詞幹提取和詞形還原實現的主流方法類似,但二者在具體實現上各有側重。詞幹提取的實現方法主要利用規則變化進行詞綴的去除和縮減,從而達到詞的簡化效果。詞形還原則相對較複雜,有複雜的形態變化,單純依據規則無法很好地完成。詞形還原更依賴於詞典,進行詞形變化和原形的映射,生成詞典中的有效詞。
  • 複雜性:詞幹提取方法相對簡單,詞形還原則需要返回詞的原形,需要對詞形進行分析,不僅要進行詞綴的轉化,還要進行詞性識別,區分相同詞形但原形不同的詞的差別。詞性標註的準確率也直接影響詞形還原的準確率,即詞形還原更爲複雜
  • 結果:詞幹提取和詞形還原也有部分區別。詞幹提取的結果可能並不是完整的、具有意義的詞,而只是詞的一部分,如“revival”詞幹提取的結果爲“reviv”,“ailiner”詞幹提取的結果爲“airlin”。而詞形還原處理後獲得的結果是具有意義的、完整的詞,一般爲詞典中的有效詞
  • 應用領域:同樣各有側重。雖然二者均被應用於信息檢索和文本處理中,但側重不同。詞幹提取更多被應用於信息檢索領域,如Solr、Lucene等,用於擴展檢索,粒度較粗。詞形還原更主要被應用於文本挖掘、自然語言處理,用於更細粒度、更爲準確的文本分析和表達。即詞形還原更具有研究和應用價值。

 

代碼

詞形還原

from nltk.stem import WordNetLemmatizer
wnl = WordNetLemmatizer()
#print(wnl.lemmatize('countries','apples'))


ff=open("xxx.txt",'a',encoding='UTF-8')
list=[];
with open("xxx.txt",'r',encoding='utf-8')as f:
    for line in f:
        LineList=[];
        for word in line.split():
            a=wnl.lemmatize(word)
            LineList.append(a);
        list.append(LineList);
for line in list:
    print(line,file=ff);

 

詞幹提取

from nltk.corpus import wordnet as wn
import jieba
import sys
from nltk.stem import WordNetLemmatizer
wnl = WordNetLemmatizer()
#print(wnl.lemmatize('countries','apples'))


ff=open("xxx.txt",'a')
list=[];
with open("xxx.txt",'r',encoding='utf-8')as f:
    for line in f:
        LineList=[];
        for word in line.split():
            a=wnl.lemmatize(word)
            LineList.append(a);
        list.append(LineList);
for line in list:
    print(line,file=ff);

 

Gensim_詞形還原

# -*- coding: utf8 -*-
import spacy
nlp = spacy.load('en', disable=['parser', 'ner'])

texts=[["x"],["xx"]]
def lemmatization(texts, allowed_postags=['NOUN', 'ADJ', 'VERB', 'ADV']):
    """https://spacy.io/api/annotation"""
    texts_out = []
    for sent in texts:
        doc = nlp(" ".join(sent))
        texts_out.append([token.lemma_ for token in doc if token.pos_ in allowed_postags])
    return texts_out

# Do lemmatization keeping only noun, adj, vb, adv
data_lemmatized = lemmatization(texts, allowed_postags=['NOUN', 'ADJ', 'VERB', 'ADV'])
data=str(data_lemmatized)
f=open('xxx.txt','w',encoding='utf-8')
f.writelines(data)
f.close()

 

說明

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章