언어학

세종코퍼스에서 특정 단어를 포함하는 문장 추출하기 - 연어 분석 (4)

cha5ylkhan 2022. 7. 30. 15:14

 

'곧이곧대로'를 포함하는 문장을 세종코퍼스 txt 파일에서 추출하는 코드를 짜 보았다.

1편에서 구상했던 두 가지 기능 중 두 번째이다. 코드는 밑에 첨부한다.

코딩이 제대로 된 거라면,

내가 가진 9,966,708어절의 코퍼스 안에서

'곧이곧대로'는 오로지 31번밖에 출현하지 않는다.

'곧이 곧대로'를 포함하지 않은 결과이긴 하다.

포함해서 세는 게 맞겠지만, 그래 봤자일지도

결과물은 이런 모습이다.

 

9백만 어절 중에 31례밖에 없으니 당연한 거겠지만

'곧이곧대로'가 아예 없는 txt 파일이 '곧이곧대로'를 하나라도 포함하는 파일보다 훨씬 많았다.

그 와중에 재미있게도,

'곧이곧대로'가 2번 나타나는 파일이 2개 있었고,

무려 3번이나 나타나는 파일도 한 개 있었다.

작가나 장르나 내용 배경의 영향이 있지 않을까 싶다.

 

 

맨 처음 연어에 대한 발상이 떠오르고서 대충 검색해 봤을 때 잘 나오지 않아서

'곧이곧대로'가 약간 저빈도 어휘인가 보다, 생각은 했지만

'9백만 분의 30' 정도로 극저빈도일 줄은 몰랐다.

31개 정도면 굳이 코딩을 더 하거나

'한마루'나 'Antconc' 같은 공기 분석 프로그램을 사용할 필요가 없어 보인다.

그리고 기껏 붙어 있는 형태소 태그를 활용할 필요도 없다.

그냥 하나하나의 사례를 직접 눈으로 확인하면 되기 때문이다.

그래서 사실 대략의 결과는 이미 나왔는데, 그건 다른 글로 적어 두겠다.

(근데 막상 직접 해 보니 은근 많긴 많다. 리스트 말고 딕셔너리 같은 형태로 저장할 걸 그랬다.)

정확한 연어값 계산은 해 봐야겠지만,

워낙에 빈도 자체가 작으니 약간만 관계가 있어도 너무 큰 수치가 나오지 않을까 하는 생각이 든다.


이번 코딩은 그다지 헤매지 않고 처음에 구상했던 대로 진행했다.

저번 걸 조금 수정해서 쓰니까 어렵지 않았다.

함수에 파일명을 넣으면

그 파일을 한 줄 한 줄 탐색하다가

'곧이곧대로'가 나오면

위로 가서 <p>를 찾고

아래로 가서 </p>를 찾은 다음에

<p>부터 </p>까지의 한 문장을 추출해서 저장하는 것이다.

그게 전부인데, 아마 코드는 엉망이겠지만 당장 잘 돌아가는 건 같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import re
import sys
sys.stdout = open('targets.txt''w', encoding='utf-8')
 
 
def collector(x):
    f = open(x, "r", encoding="utf-16-le")
    data = f.readlines()
    result = []
    for i in range(len(data)):
        a = re.findall("곧이곧대로", data[i])
        if a != []:
            for j in range(i, -1-1):
                if data[j][0!= '<':
                    continue
                else:
                    starting_point = j
                    break
            for k in range(i, len(data), 1):
                if data[k][0!= '<':
                    continue
                else:
                    ending_point = k
                    break
            for l in range(starting_point, ending_point+11):
                result.append(data[l][0:len(data[l])-1]) # 개행문자 제거
 
    return result
 
 
filenames = open("list.txt""r", encoding='utf-8')
filenames = filenames.readlines()
# ['BTAA0001.txt\n', 'BTAA0002.txt\n', 'BTAA0003.txt\n',
# 'BTAA0004.txt\n', ... , 'BTJO0447.txt']
 
sum = []
for i in range(len(filenames)):
    sum.append('FILE #' + str(i+1))
    name_with_extra_n = filenames[i]
    if i == len(filenames) - 1:
        goodname = name_with_extra_n
    else:
        goodname = name_with_extra_n[0:len(name_with_extra_n)-1]
    result = collector(goodname)
    if result == []:
        sum.append('****** NO RESULT ******')
    else:
        for j in range(len(result)):
            sum.append(result[j])
 
for i in range(len(sum)):
    print(sum[i])
 
sys.stdout.close()
 
# 31 in total
 
cs

 

 

결과물 'targets.txt'는 위에 첨부한 사진과 같은 모습이다.


1편 - https://blog.naver.com/ks1127zzang/222824981687

 

코퍼스로 연어(collocation) 분석해 보기 (1)

문득 '곧이곧대로'라는 단어가 아주 특정한 몇 개의 단어 또는 구문과 주로 함께 쓰이는 거 같다...

blog.naver.com

2편 - https://blog.naver.com/ks1127zzang/222826100700

 

세종코퍼스의 어절 수 추출하기 - 연어 분석 (2)

세종코퍼스 txt 파일의 어절 개수를 추출하는 아주 간단한 기능을 구현해 보았다. 추출한다기보다는 그냥 ...

blog.naver.com

3편 - https://blog.naver.com/ks1127zzang/222826423187

 

세종코퍼스 어절 수 추출 성공 - 아무튼 연어 분석 하는 중 (3)

이렇게 생긴 세종코퍼스 txt 파일로부터 코퍼스의 어절 수를 추출해 내는 기능을 만들어 보려다가 헤맸었다...

blog.naver.com

 

오늘 참고한 글 

 

visual studio에서 함수명/변수명 한번에 바꾸기 - https://itisguide.tistory.com/23

 

[Visual Studio] 함수명, 변수명 일괄 변경하는 방법

함수명, 변수명 바꾸기 프로그래머가 가장 힘들어하는 일은 이름 짓기라고 한다. 이름을 짓기가 어려운 만큼, 보다 더 좋은 이름이 떠오르면 바꾸고 싶은 생각도 하기 마련이다. 그것은 클래스,

itisguide.tistory.com