텍스트를 땅의 문장과 대사로 따로 계산

19638 단어 Python3

소개



야마우치 장승 「Python에 의한 텍스트 마이닝 입문」(옴사)의 이해를 깊게하기 위해서, 텍스트의 편집으로부터 분석을 실시하는 스크립트를 썼습니다.
상기서와 다른 것은 땅의 문장과 대사를 나누어 분석하고 있는 곳입니다.

스크립트에서,
if word[0] == """or word[-1:] == """:
의 처리에 의해, 대사라고 판단하고 있습니다.
(지금이 되어 생각하면, 이 처리라면,
"대사 1.
대사 2.
"대사 3"
같은 문장이라면 중간이 땅의 문장으로 나뉘어 버리므로 나중에 개선됩니다)
문장 단위로 나누는 방법은 구점 외에! 아니? , … … 뒤에 오는 전각 공간을 사용합니다.

지문의 문장의 문자수를 카운트해 히스토그램을 작성해 상위 10개의 빈출 단어를 출력하는 스크립트


# -*- coding: utf-8 -*-
from collections import Counter
import re
import numpy as np
import matplotlib.pyplot as plt

path_txt = 'text_utf-8.txt'

with open(path_txt, encoding='utf-8') as txt:
    string = txt.read()

#改行を目安にリスト形式へ変換
string = string.splitlines()

#元のテキストに複数改行があるとリストの要素に空が入ってくるので、それを削除
string = [a for a in string if a != '']

#文頭の一文字下げの全角スペースを削除。文中の全角スペースは残して、後で文の分割で使う
string = [a.lstrip(" ") for a in string]

#文章を、地の文と台詞に分ける
string_descriptive = [] #地の文
string_quote = [] #台詞

for word in string:
    if word[0] == "「" or word[-1:] == "」":
        string_quote.append(word)
    else:
        string_descriptive.append(word)

#地の文を、さらに一文ごとに分割
string_sentence = [] #一文ずつ入れるリスト
string_sentence_tmp = []

# 句点で分割。句点そのものは残す。要Python3.7以降
for word in string_descriptive:
    string_sentence_tmp.extend(re.split("(?<=。)",word))

# 「!」などに続く全角空白で分割。
for word in string_sentence_tmp:
    string_sentence.extend(word.split(" "))

#上の処理だと、リストの中に空の要素が入ってしまうので、取り除く。
string_sentence = [a for a in string_sentence if a != '']

#各々のリストの要素数を出力
print("地の文の行数は",len(string_descriptive)," 地の文に含まれる一文の数は",len(string_sentence)," 台詞の数は",len(string_quote))

#一文毎に分けたリストの各文章の長さをカウントして上から100個を出力
cnt = Counter([len(x) for x in string_sentence])
print(sorted(cnt.items(), key=lambda x: x[1], reverse=True)[:100])

#ヒストグラムの出力
nstring = np.array([len(x) for x in string_sentence if len(x) < 150])
print('max', nstring.max())
plt.hist(nstring, bins=nstring.max())
plt.show()

#上位10個の頻出単語を出力
cnt_countall = Counter([x for x in string_sentence])
print(sorted(cnt_countall.items(), key=lambda x: x[1], reverse=True)[:10])

대사 문장의 문자 수를 세어 히스토그램을 만들고 상위 10개의 빈출 단어를 출력하는 스크립트(거의 위의 처리와 동일)


# -*- coding: utf-8 -*-
from collections import Counter
import re
import numpy as np
import matplotlib.pyplot as plt

path_txt = 'text_utf-8.txt'

with open(path_txt, encoding='utf-8') as txt:
    string = txt.read()

#改行を目安にリスト形式へ変換
string = string.splitlines()

#元のテキストに複数改行があるとリストの要素に空が入ってくるので、それを削除
string = [a for a in string if a != '']

#文頭の一文字下げの全角スペースを削除。文中の全角スペースは残して、後で文の分割で使う
string = [a.lstrip(" ") for a in string]

#文章を、地の文と台詞に分ける
string_descriptive = [] #地の文
string_quote = [] #台詞

for word in string:
    if word[0] == "「" or word[-1:] == "」":
        string_quote.append(word)
    else:
        string_descriptive.append(word)

#台詞から、鍵括弧を削除
string_quote = [a.lstrip("「") for a in string_quote]
string_quote = [a.rstrip("」") for a in string_quote]


#台詞を、さらに一文ごとに分割
string_quote_line = [] #一文ずつ入れるリスト
string_quote_line_tmp = []

# 句点で分割。要Python3.7以降
for word in string_quote:
    string_quote_line_tmp.extend(re.split("(?<=。)",word))

# 「!」などに続く全角空白で分割。
for word in string_quote_line_tmp:
    string_quote_line.extend(word.split(" "))

#上の処理だと、リストの中に空の要素が入ってしまうので、取り除く。
string_quote_line = [a for a in string_quote_line if a != '']

#一文毎に分けたリストの各文章の長さをカウントして上から100個を出力
cnt = Counter([len(x) for x in string_quote_line])
print(sorted(cnt.items(), key=lambda x: x[1], reverse=True)[:100])

#ヒストグラムの出力
nstring = np.array([len(x) for x in string_quote_line if len(x) < 150])
print('max', nstring.max())
plt.hist(nstring, bins=nstring.max())
plt.show()

cnt_countall = Counter([x for x in string_quote_line])
print(sorted(cnt_countall.items(), key=lambda x: x[1], reverse=True)[:10])

실행



소지한 라노베를 OCR하여 만든 텍스트로 시도했습니다.
1장째가 땅의 문장, 2장째가 대사입니다. 라노베는 한 문장이 짧다고합니다. 대사는 그 이상으로 짧았습니다.




덧붙여서, 다음은, 땅의 문장과 대사의 빈출문의 상위 10입니다.

땅 문장
[('그래.', 154), ('그리고──', 107), ('하지만.', 83), ('과연.', 81), ('다음 예고', 62), ('… …………………', 61), ('모습', 61), ('그리고.', 58), ('굉장히.', ​​52), ('아니요.', 52)]

대사
[('훗!', 365), ('훗.', 336), ('호-훗 호호!', 291), ('그래.', 120), ('아.', 103) , ('아.', 100), ('아니.', 100), ('얼음의 화살!', 97), ('에?', 86), ('그래.', 77)]

좋은 웹페이지 즐겨찾기