lxml, BeautifulSoup 등을 활용하며 자료를 수집했는데, 작업중 몇가지 문제가 발생하였습니다.
- lxml 수집시 \text() 함수에서
<오늘의 요리>
텍스트를 Skip 하는 문제 - bs4 객체로 54만개 실행시, 24만개에서 Memory Error 문제 (8Gb 사용 중)
이러한 상황들이 발생했을때, 크롤링 모듈을 사용해서는 해결하기 어려운 문제가 발생하게 되었고, 결국은 Regex 를 사용해서 작업을 해야 되어서 2번 작업을 하게되는 번거로움이 발생하였습니다.
이러한 이유로 Regex 를 사용한 작업들을 정리해 보려고 합니다.
사용되는 내용
정규식 문법에 사용되는 몇가지 용어들을 정리해 보겠습니다.
Meta 기호들
작업을 하다보면 Escape 작업이 필요한 경우가 있는데, 이는 Meta 문자와 기호들이 해당됩니다.
Meta문자는 ., ^, $, *, +, ?, {, }, [, ], \, |, (, )
가 있습니다.
- \ : 역슬래시(\) 는 Escape 기능함수 로 기호를 문자열로 변환
- ( ) : 객체 집합, 다른말로 하위 표현식 이라고 합니다.
- [ ] : 객체 범위
- { } : 객체의 구간(interval) 값의 정의
- | : 경우의 수를 묶는 Or 선택자 로 객체묶음과 함께 활용 ex)
(<br>|<br/>)
- \s : 공백 Space 로, \S 는 ^\s 와 동일 합니다
- \n : 줄 바꿈
- \r : Enter 줄 바꿈 (캐리지 리턴)
- \t : Tap 공백
- \w : 문자열 선택으로 \W 는 ^\w 와 동일 합니다
- \d : 숫자 선택으로 \D 는 ^\d 와 동일 합니다
- . : 숫자, 문자, 기호들 모두 선택가능한 Meta 문자
- ^ : 는 캐럿문자 로 바로 뒤 문자,범위,집합을 제외한 나머지
- *: 는 Hash String 으로 0개 ~ 여러개 일치를 확인
- +*: 는 1개 ~ 여러개 일치를 확인
- ? : 제한된 범위만큼 일치여부 확인 cf> * (탐욕적 수량자), *?(게으른 수랑자)
다중행 에서의 Meta 기호들
이 부분에서 주의할 점으로 위의 Meta 기호와 동일한 내용이, 다른 용도로 활용되는 ^ 와 $ 에 대해 알아보려고 합니다.
(?m)^\s*//.*$
# // 주석 내용의 수집
위 내용에서 정규식 기능을 하는 부분은 ^\s*//.*$
입니다. 이는 앞에 여백이 있는 HTML 주석을 특정할 수 있는 정규식 기호로써 활용 가능합니다. 위에서 살펴본 ^ 는 범위나 집합 에서 사용되는 경우를 의미하고, 이번 내용에서는 선택 문자열의 시작 조건과 종료 조건 을 의미 합니다.
(?m)\A\s*//.*\Z
시작과 종료 조건으로 ^, $ 대신에 \A, \Z 를 사용할 수 있습니다. 생긴것 만으로도 의미를 알 듯.... 참고로 (?m) 추가되어 있는데, 다중 행 (multiline) 을 지원합니다.
하위 표현식 ( )
(((\d{1,2})|(1\d{2})|(2[0-9]\d))\.)
여러 Meta 기호 의 묶음으로 특정이 가능한 방식으로 ( ) 내부에 | 와 같은 Filter 를 사용하여 구현을 하면 보다 다양한 경우들을 함께 처리할 수 있습니다. 하위 표현식 내부에, 하위 표현식 을 중첩하여 처리도 가능합니다.
역참조 활용 \1 \2 \3…..
"{} {} {}".format()
에서 {1} {2} {3}
을 사용하는 문법이 있습니다. 숫자는 객체의 인덱스 값 으로 해당 문자열의 호출 및 재활용에 유용하게 만든 것인데, 이러한 객체의 재활용 문법 이 regex 에서도 가능 합니다.
(\w+)[ ]+\1
앞에서 보지못한 문법으로, 앞에서 정의된 하위 표현식 객체들을 차례로 인덱스로 정의하여 호출하는 문법입니다 \1 은 첫번째 하위 표현식 객체 를 의미하고, \2, \3 은 2번째 3번째 정의한 **하위 표현식 객체 들로 해당 내용을 호출하고 재활용 합니다. 주의할 점으로 \0 은 표현식 전체 를 의미 합니다.
역 참조를 활용한 치환
객체의 내용을 재활용 하는 작업으로는 치환 작업에 유용 합니다. 책에서는 Perl 언어를 사용하여 $1, $2
와 같이 변형된 내용을 활용합니다.
Django 내용을 공부했던 것들과 함께, 정규식의 내용을 익히는 과정인 만큼, Python 에서 활용방법은 점프 투 파이썬 에 설명된 내용을 활용 하도록 합니다.
import re
p = re.compile(r"(?P<name>\w+)\s+(?P<phone>(\d+)[-]\d+[-]\d+)")
print(p.sub("\g<phone> \g<name>", "park 010-1234-1234"))
>> 010-1234-1234 park
p = re.compile(r"(?P<name>\w+)\s+(?P<phone>(\d+)[-]\d+[-]\d+)")
print(p.sub("\g<2> \g<1>", "park 010-1234-1234"))
>> 010-1234-1234 park
긍정형 후방탐색 ?<=
"\$[0-9.]+"
: [‘$23.24’, ‘$69.23’]
"(?<=\$)[0-9.]+"
: [‘23.24’, ‘69.23’]
위 2개의 정규식은 Target 대상이 동일합니다. 대신 후자를 사용하면 $ 를 제외한 나머지만 출려함을 알 수 있습니다. 이처럼 대상의 특정을 위해 지정은 했지만 최종 출력시 제외하는 대상 을 하위 표현식을 활용하여 특정 을 할 때 사용 합니다.
긍정형 의 의미는 조건과 일치하는 대상을, 후방탐색 은 일치된 대상을 출력시에는 제외 하는 문법 입니다. 부정형 전방/ 후방탐색 방법도 존재하는데 일치하지 않는 대상 을 적용하는 것으로 기본적인 골격은 위 내용과 동일 합니다
String을 기호들을 활용하여 판단 조건문을 생성한다
Square Bracket []
String 문자열의 시작조건을 정의한다
- [abc] : a, b, c 중 1개로 시작되는 1개 단어
- [abc]. : a, b, c 중 1개로 시작되는 (“.” : 1개 단어) 2개 단어
- [abc][ABC] : 1개는 a,b,c , 다음의 1개는 A,B,C 로 이어지는 2개 단어
- [A-z] : 1개가 A~z Range 범위내 있는 1개 단어
Sub Pattern ()
(on | ues | rida)
: 문서내부에 on 또는, ues, 또는 ride 해당 문자만 추출
In > tokenizer = re.compile('(on|ues|rida)')
In > tokenizer.findall('Monday Tuesdat Friday')
Out >> ['on', 'ues', 'rida']
In > tokenizer = re.compile('(Mon|Tues|Fri)day')
In > tokenizer.findall('Monday Tuesday Friday')
Out >> ['Mon', 'Tues', 'Fri']
In > tokenizer = re.compile('..(id|esd|nd)ay')
In > tokenizer.findall('Monday Tuesday Friday')
Out >> ['nd', 'esd', 'id']
Quantifier (수량자)
패턴의 출현빈도를 정의한다
- : Zero or More times ? : Zero or Once
- : Once or More times . : Once (Any Charactor) {} : 출현하는 객체의 수를 입력
In > tokenizer = re.compile('.{2}')
In > tokenizer.findall('Monday Tuesday Friday')
Out >> ['Mo', 'nd', 'ay', ' T', 'ue', 'sd', 'ay', ' F', 'ri', 'da']
Pattern (경계)
- \w :
- 낭비없이 빠르게 구현한다

상대단위 | 설명 |
---|---|
px | 모니터 화소(1픽셀) 기준 |
자연어 관련작업 2주간 Process 로써 메뉴의 분류기준 고유단어 선별 및 연관성 높은 형용사, 동사, 고유명사 내용을 분석 및 정리한 후, 간단한 예제 Site 를 구성해 보도록 하겠습니다.
NLP Working Process..
- Step 1: Sentence Segmentation. …
- Step 2: Word Tokenization. …
- Step 3: Predicting Parts of Speech for Each Token. …
- Step 4: Text Lemmatization. …
- Step 5: Identifying Stop Words. …
- Step 6: Dependency Parsing. …
- Step 6b: Finding Noun Phrases. …
- Step 7: Named Entity Recognition (NER)
복잡하게 되어 있지만, 수집 대상을 특정한 뒤
- Text Source
- Focused Crawling DataSet
- Pre Processing and Write to SQL
- Sentence Segmentation
- Word Token Zif’s Law, Tf-Idf Calculate
- Token 간의 연관성 계산 : Cosine, word2vec, k-means, knn
- NER 학습모델 만들기 및 모델의 성능확인
- Unique Token 의 수집 및 분석모델 만들기
참고자료
1유효한 token 선별 메뉴를 token vector 로 유사군 묶기 k means LDA 를 활용한 용언 (형용사 동사) OKt 빈도높은 단어들로 묶기 - 단어 가둥치 다르게 적용 사전에 없는 단어들은 무시 하고 묶기 기타 사람이름 방송프로 지역명은 고유 token에 추가하기
Page Link : Document 별 수집경로의 가중치를 정의한 뒤, 수집된 문서별 가중치 값을 저장 합니다. DTM , TMD 데이터를 저장하는 경우 데이터 베이스에 저장을 합니다. TDM 모델을 만든 뒤 문서의 Token 별로 인덱스를 풀어낼 수 있도록 저장합니다. 자세한 내용은 NDBM Tutorial 내용을 참조 합니다
Question!!
- TDM 을 DataBase 에 저장하면 새로운 문서가 나올때 마다 새로저장??
- TWM 이란? DVL 이란? 참신러닝
- 우분투 에서 Mecab 말고 추가로 가능한 것은?
확률의 계산
개별확률과 결합확률을 알면, 조건부 확률을 계산할 수 있습니다.
\[P(X|Y) = P(X,Y) / P(Y)\]Latent Dirichlet Allocation
Topic 모델링 방법으로 대표적이다
문서의 분포만으로 주제를 잠재적으로 추정 가능한 모델링 입니다.

LDA 분석을 위해선 개별 Topic 별로 word 를 특정 가능합니다

Topic Modeling
개별 특징들을 찾아내는 방법
- Topic 의 갯수
- The Proportion of Topics
- The Most probable words in topics (주제별 중요 단어들)
- Text analysis without reading the whold corpus
현황에 대한 분석
해당 내용에 대한 생각
문제점 지적
해결책 제시 (기승전결)
LDA 모델링
Theta D 번쨰 : Topic
Z : 개별 단어들의 Topic 해당하는 확률

Dirichlet Distribution
디리클레 분포 를 사용하여 Alpha 와 Beta 값은 고정 됩니다.
\theta_i (문서의 Topic 분포) ~ Dir(\alpha), i
\pi_k (Topic 단어의 분포 : 조건부 확률) ~ Dir(\beta), k
cf) Pi 값은 Topic 갯수만큼 존재합니다.
Z_{i,z} ~ i (문서) l(token의 번호) : Pi 에서 단어를 가져올 수 있다
W_{i,z} ~ Multi(pi_{z{i,j}}) (단어) : 유일하게 측정 가능한 값
Gibbs Sampling
Marginalization, Summing Out
나머지들은 무시하고 샘플링하는 방법으로 Collapsed Gibbs Sampling (Grapical Sampling)
콜렙스트 깁스샘플링 방법입니다.
lda 방식에서는 1개의 단어 수집을 위해서는, 주변의 단어들을 활용합니다.

Prior Bayse 모델로 개별 단어들이 Topic 해당여부를 Given 으로 모델을 해석합니다. (조건부 확률을 사용하여 찾습니다.)
\pi^{M_j} \pi^{N_l} P(W_{i,l} | Z_{j,l}) |
j 문서 의, i 토픽 의, k 단어 인덱스 로 해당 단어별 수식을 정리할 수 있습니다.

문서마다 갖고있는 Topic 의 갯수 확률과, 단어의 빈도값을 활용하여 디리클레 분포 에서 Z 값을 계산하는 공식으로 정리를 합니다.
Conjugate Prior 과정을(모든 발생확률을 더해서 1로 변환) 통해, Z 이외의 변수값들을 모두 제거하였습니다.
Z 값은 Token 별로 계산되는 값으로 주변 단어들에 의해 모델링의 영향을 받습니다.
\[\Gamma(x) = (x-1)!\]Parameter Inference
perplexity : LDA 의 Alpha 와 Beta 값이 클수록 중심으로 모인다, 따라서 Alpha 와 Beta 값이 작아서 계산된 Z 값들이 각각의 Topic 별로 구분이 가능하도록 반복학습을 진행 합니다.
이를 반복하면 결과값은 다음의 2가지 결과를 도출할 수 있습니다.
- $\theta$ 값은 문서 마다 Topic 의 분포 분석결과
- $\pi$ 값은 단어 마다 Topic 의 분포 분석결과 (WordCloud 상 빈도가 높은 단어)
Question! Q. 그럼 Topic 단어들은 미리 수집되어 있어야 하나?
\[a^2 + b^2 = c^2\]RDBMS , NDBM
감성분석
트위터를 활용한 감성분석 예제 논문보기

PMI (Point wised Mutual Information) : 통계를 사용한 방법으로 point Wise 한 점을 찍어서 유사한 그룹들ㅇ르 찾습니다.
Simentic Orientation (SO) : So(x) = PMI(Positive) - PMI(Negative)