230508 / BSA10. pyspark의 Natural Language Processing

BSA07_Pyspark-NLP.ipynb

 

패키지 호출 및 스파크 세션 시작

from pyspark.sql import SparkSession
from pyspark.ml.feature import Tokenizer, RegexTokenizer  # RegexTokenizer : 데이터를 쪼개는 작업을 위한 것
from pyspark.ml.feature import StopWordsRemover
from pyspark.ml.feature import NGram
from pyspark.ml.feature import HashingTF, IDF,  Tokenizer
from pyspark.ml.feature import CountVectorizer

spark = SparkSession.builder.appName("nlp").getOrCreate()

 

데이터 불러오기

# inferSchema=True : 데이터의 속성을 보고 읽어들이도록
df = spark.read.csv("NLP.txt",header=False,inferSchema=True,sep="\t")

# 20개의 행을 보여줌
df.show()

 

데이터 전처리

# withColumnRenamed : 데이터프레임의 컬럼명 변경
df = df.withColumnRenamed("_c0","label").withColumnRenamed("_c1","text")

# 텍스트를 단어로 쪼개는 작업을 선언함 (아직 작업을 수행하지는 않음)
# 별개의 데이터프레임으로 구성됨
tokenizer = Tokenizer(inputCol="text",outputCol="words")  # 'text'를 input으로, 'words'를 output으로
regexTokenizer = RegexTokenizer(inputCol="text",outputCol="words",pattern="\\W")

# tokenizer에 실제로 데이터를 적용함 
tokenized = tokenizer.transform(df)
# truncate=False : 결과값을 끝까지 다 보고 싶을 때 
tokenized.select("words").show(3,truncate=False)  # tokenized에서 'words'의 첫 3개 행의 결과값을 다 보여줌

regexTokenized = regexTokenizer.transform(df)
regexTokenized.select("words").show(3,truncate=False)

 

불용어 제거

text_df = regexTokenized
# text_df.show(truncate=False)

# 'words'에 있는 데이터에서 불용어를 제거하고 'cleaned'에 저장하는 작업을 선언함
remover = StopWordsRemover(inputCol="words",outputCol="cleaned")
# 위에서 선언한 'remover' 작업을 실행함
text_df = remover.transform(text_df)

 

n-gram

# 'words'에서 인접한 2개의 단어를 묶은 것을 'bigrams'에 저장하는 작업을 선언함
bigram = NGram(n=2, inputCol="words",outputCol="bigrams")
# 선언한 작업 'bigram'을 실행하고 'bigram_df'에 저장함
bigram_df = bigram.transform(text_df)
bigram_df.select("bigrams").show(3,truncate=False)

 

BOW(Bag of Words)

tokenizer = RegexTokenizer(inputCol="text",outputCol="words",pattern="\\W")
words_df = tokenizer.transform(df)
words_df.show()

# 1. HashingVectorizer ⟶  TfidfTransformer ⟶ 설명변수로 모형 적용
# numFeatures=20 : 20개의 벡터(차원)으로 표현
hashingTF = HashingTF(inputCol="words",outputCol="hashfeature",numFeatures=20)
hashed_df = hashingTF.transform(words_df)
hashed_df.show()

idf = IDF(inputCol="hashfeature",outputCol="features")
idf_model = idf.fit(hashed_df)

rescale = idf_model.transform(hashed_df)
rescale.select("label","features").show()
# label : 반응변수, features : 설명변수로 보고 모델에 적용함


# 2. CountVectorizer ⟶  TfidfTransformer ⟶ 설명변수로 모형 적용
cv = CountVectorizer(inputCol="words",outputCol="features",vocabSize=5, minDF=2.0)
model = cv.fit(words_df)
res = model.transform(words_df)
res.show()