<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 第6章
Step1:  50. 文区切り
(. or ; or 
Step2:  51. 単語の切り出し
空白を単語の区切りとみなし，50の出力を入力として受け取り，1行1単語の形式で出力せよ．ただし，文の終端では空行を出力せよ．
Step3:  52. ステミング
51の出力を入力として受け取り，Porterのステミングアルゴリズムを適用し，
単語と語幹をタブ区切り形式で出力せよ．
Pythonでは，Porterのステミングアルゴリズムの実装としてstemmingモジュールを利用するとよい．
ステミング(stemming)
同じような話題を指している語を一つの素性としてみなしたいとき、
派生語なども含めて同一の素性とみなす作業のこと。
例. ”run”, “runs”, “ran” さらに”runner”など。
ポーターのステマー(Porter’s stemmer)
英語のステミングの手法。多くの規則がある。
規則の例
語尾のedを除去する(walked→walk)  
語尾のateを除去する(passionate→passion)  
語尾のationalを除去する(operational→oper)  
“operational”と ”operate”は同じ ”oper” として扱えるが、
(hundred→hundr)となってしまったり、
(international→intern)と、意味が変わってしまうこともある。
Step4:  53. Tokenization
Stanford Core NLPを用い，入力テキストの解析結果をXML形式で得よ．
また，このXMLファイルを読み込み，入力テキストを1行1単語の形式で出力せよ．
Step5:  54. 品詞タグ付け
Stanford Core NLPの解析結果XMLを読み込み，単語，レンマ，品詞をタブ区切り形式で出力せよ．
Step6:  55. 固有表現抽出
入力文中の人名をすべて抜き出せ．
Step7:  56. 共参照解析
Stanford Core NLPの共参照解析の結果に基づき，
文中の参照表現（mention）を代表参照表現（representative mention）に置換せよ．
ただし，置換するときは，「代表参照表現（参照表現）」のように，元の参照表現が分かるように配慮せよ．
Step8:  57. 係り受け解析
Stanford Core NLPの係り受け解析の結果（collapsed-dependencies）を有向グラフとして可視化せよ．
可視化には，係り受け木をDOT言語に変換し，Graphvizを用いるとよい．
また，Pythonから有向グラフを直接的に可視化するには，pydotを使うとよい．
Step9:  58. タプルの抽出
Stanford Core NLPの係り受け解析の結果（collapsed-dependencies）に基づき，
「主語 述語 目的語」の組をタブ区切り形式で出力せよ．
ただし，主語，述語，目的語の定義は以下を参考にせよ．  
主語
<ASSISTANT_TASK:>
Python Code:
import pickle
Explanation: 第6章: 英語テキストの処理
英語テキストのnlp.txtに対して, 以下の処理を実行せよ
End of explanation
def separate_sentences(filename):
    checks = ['. ', '; ', '? ', '! ']
    for sentences in open(filename, 'r'):
        sentences = sentences.strip()
        sep_flag = False
        sep_index = 0
        check_sign = ''
        for i in checks:
            if i in sentences:
                check_sign = i
                sep_index = sentences.find(i)
                sep_flag = sentences[sep_index+2].isupper()
                continue
                
        if sep_flag:
            splited_sentences = sentences.split(check_sign)
            for s in splited_sentences:
                if s[-1] not in (check_sign[0]):
                    print(s+check_sign[0]+'\n')
                else:
                    print(s)
        else:
            print(sentences)
            
separate_sentences('nlp.txt')
l_sentences = []
def separate_sentences(filename):
    checks = ['. ', '; ', '? ', '! ']
    for sentences in open(filename, 'r'):
        sentences = sentences.strip()
        sep_flag = False
        sep_index = 0
        check_sign = ''
        for i in checks:
            if i in sentences:
                check_sign = i
                sep_index = sentences.find(i)
                sep_flag = sentences[sep_index+2].isupper()
                continue
                
        if sep_flag:
            splited_sentences = sentences.split(check_sign)
            for s in splited_sentences:
                if s[-1] not in (check_sign[0]):
                    l_sentences.append(s+check_sign[0]+'\n')
                else:
                    l_sentences.append(s)
        else:
            l_sentences.append(sentences)
            
separate_sentences('nlp.txt')
with open('nlp.pickle', 'wb') as f:
    pickle.dump("".join(l_sentences), f)
Explanation: 50. 文区切り
(. or ; or : or ? or !) → 空白文字 → 英大文字というパターンを文の区切りと見なし，入力された文書を1行1文の形式で出力せよ．
End of explanation
with open('nlp.pickle', 'rb') as f:
    sentences = pickle.load(f)
words = sentences.split(' ')
with open('nlp_words.pickle', 'wb') as f:
    pickle.dump(words, f)
with open('nlp_words.txt', 'w') as f:
    for word in words:
        f.write(word.rstrip()+'\n')
Explanation: 51. 単語の切り出し
空白を単語の区切りとみなし，50の出力を入力として受け取り，1行1単語の形式で出力せよ．ただし，文の終端では空行を出力せよ．
End of explanation
from nltk.stem import PorterStemmer
porter = PorterStemmer()
with open('nlp_words.pickle', 'rb') as f:
    words = pickle.load(f)
    
stem_words = []
for word in words:
    stem = porter.stem(word)
    stemmed = word[len(stem):]
    stem_words.append(stem+'\t'+stemmed+'\n')
with open('nlp_stems.pickle', 'wb') as f:
    pickle.dump(stem_words, f)
with open('nlp_stems.txt', 'w') as f:
    for stem in stem_words:
        f.write("".join(stem))
Explanation: 52. ステミング
51の出力を入力として受け取り，Porterのステミングアルゴリズムを適用し，
単語と語幹をタブ区切り形式で出力せよ．
Pythonでは，Porterのステミングアルゴリズムの実装としてstemmingモジュールを利用するとよい．
ステミング(stemming)
同じような話題を指している語を一つの素性としてみなしたいとき、
派生語なども含めて同一の素性とみなす作業のこと。
例. ”run”, “runs”, “ran” さらに”runner”など。
ポーターのステマー(Porter’s stemmer)
英語のステミングの手法。多くの規則がある。
規則の例
語尾のedを除去する(walked→walk)  
語尾のateを除去する(passionate→passion)  
語尾のationalを除去する(operational→oper)  
“operational”と ”operate”は同じ ”oper” として扱えるが、
(hundred→hundr)となってしまったり、
(international→intern)と、意味が変わってしまうこともある。
End of explanation
%%bash
cd stanford-corenlp-full-2015-04-20/
sh corenlp.sh -file ../nlp.txt
cp nlp.txt.xml ../
Explanation: 53. Tokenization
Stanford Core NLPを用い，入力テキストの解析結果をXML形式で得よ．
また，このXMLファイルを読み込み，入力テキストを1行1単語の形式で出力せよ．
End of explanation
import xml.etree.ElementTree as etree
tree = etree.parse('nlp.txt.xml')
root = tree.getroot()
temp = []
for tokens in root.iter('token'):
    temp.append(tokens.find('word').text+'\t'+\
                 tokens.find('lemma').text+'\t'+\
                 tokens.find('POS').text+'\n')
with open('nlp_tag.pickle', 'wb') as f:
    pickle.dump("".join(temp), f)
with open('nlp_tag.txt', 'w') as f:
    f.write("".join(temp))
Explanation: 54. 品詞タグ付け
Stanford Core NLPの解析結果XMLを読み込み，単語，レンマ，品詞をタブ区切り形式で出力せよ．
End of explanation
with open('nlp_tag.pickle', 'rb') as f:
    tokens = pickle.load(f)
    
for token in tokens.split('\n'):
    splited_token = token.split('\t')
    if splited_token[-1] == 'NNP':
        print(splited_token[0])
Explanation: 55. 固有表現抽出
入力文中の人名をすべて抜き出せ．
End of explanation
import xml.etree.ElementTree as etree
tree = etree.parse('nlp.txt.xml')
root = tree.getroot()
temp = []
for mentions in root.iter('mention'):
    if mentions.attrib != {}:
        representative = mentions.find('text').text
    else:
        temp.append(mentions.find('text').text+'->'+representative)
        
Explanation: 56. 共参照解析
Stanford Core NLPの共参照解析の結果に基づき，
文中の参照表現（mention）を代表参照表現（representative mention）に置換せよ．
ただし，置換するときは，「代表参照表現（参照表現）」のように，元の参照表現が分かるように配慮せよ．
End of explanation
import xml.etree.ElementTree as etree
import pygraphviz as pgv
tree = etree.parse('nlp.txt.xml')
root = tree.getroot()
collapse = []
collapse_list = []
for collapses in root.iter('dependencies'):
    if collapses.attrib['type'] in ('collapsed-dependencies'):
        for dep in collapses:
            collapse.append((dep.find('governor').text, dep.find('dependent').text))
        collapse_list.append(collapse)
        collapse = []
graph_list = []
for i, sentence in enumerate(collapse_list):
    g = pgv.AGraph(overlap='false')
    for node in sentence:
        if (node[0] in ('ROOT')):
            g.add_node(node[1])
        else:
            g.add_edge(node, spline='true') 
    g.layout()
    g.draw('./Untitled Folder/'+(str(i+1))+'.png')
    del(g)
Explanation: 57. 係り受け解析
Stanford Core NLPの係り受け解析の結果（collapsed-dependencies）を有向グラフとして可視化せよ．
可視化には，係り受け木をDOT言語に変換し，Graphvizを用いるとよい．
また，Pythonから有向グラフを直接的に可視化するには，pydotを使うとよい．
End of explanation
import pygraphviz as pgv
from collections import defaultdict
def choice_svo(xml_name):
    tag_collapsed = "<dependencies type=\"collapsed-dependencies\">"
    tag_collapsed_end = "</dependencies>"
    collapsed_flag = False;
    tag_governor = "</governor>"
    tag_dependent = "</dependent>"
    tag_dep = "<dep type=\""
    dep_type_flag = False 
    dep_type = ''
    dep_dict = defaultdict(lambda:  defaultdict(list) )
    sentence_id = 0; sentence_num = ''
    for line in open(xml_name):
        if tag_collapsed in line:
            sentence_id += 1
            sentence_num = str(sentence_id) + "\t"
            collapsed_flag = True
            dep_dict = defaultdict(lambda:  defaultdict(list) )
        if collapsed_flag:
            if tag_collapsed_end in line:
                make_svo(dep_dict)
                collapsed_flag = False
                
            if tag_dep in line:
                dep_type = line.replace(tag_dep, '').strip().split("\"")[0]
                if dep_type == "dobj" or dep_type == "nsubj":
                    dep_type_flag = True
                else:
                    dep_type_flag = False
            if dep_type_flag:
                if tag_governor in line:
                    governor = line.replace(tag_governor, '').strip().split(">")[1]
                elif tag_dependent in line:
                    dependent = line.replace(tag_dependent, '').strip().split(">")[1]
                    dep_dict[dep_type][governor].append(dependent)
def make_svo(dep_dict):
    predicate_list = list()
    for governor_word in dep_dict["nsubj"]:
        if governor_word in dep_dict["dobj"]:
            predicate_list.append(governor_word)
    subject_list = list()
    object_list = list()
    for predicate in predicate_list:
        print("\t".join((",".join(dep_dict["nsubj"][predicate]), \
                   predicate, ",".join(dep_dict["dobj"][predicate]) )))
        
if __name__ == "__main__":
    xml_name = "nlp.txt.xml"
    choice_svo(xml_name)
Explanation: 58. タプルの抽出
Stanford Core NLPの係り受け解析の結果（collapsed-dependencies）に基づき，
「主語 述語 目的語」の組をタブ区切り形式で出力せよ．
ただし，主語，述語，目的語の定義は以下を参考にせよ．  
主語: 述語からnsubj関係にある子（dependent）  
述語: nsubj関係とdobj関係の子（dependant）を持つ単語    
目的語: 述語からdobj関係にある子（dependent）
End of explanation
<END_TASK>