# 引入系统函数、Mecab函数
import os
import MeCab
# 设定词典为Unidic词典
dic_path = r'D:\programs\Mecab\dic\unidic-cwj-3.1.0'
# 设定处理模式，括号里空着即""着代表默认形态输出
# ipadic输出格式：
# -Owakati代表仅做词语分割,-Ochasen代表兼容ChaSen工具的模式，-Oyomi代表全读音模式
# -Odump代表全部要素输出模式，-Osimpl代表简洁模式(只有原词和词性)
# (将ipadic目录下dicrc文件里的代码复制到unidic的dicrc里，即可实现兼容)
# unidic输出格式：
# -Ounidic22为unidic的全要素输出模式，也是其默认模式
# -Overbose为详细标签输出模式，每个分词都用英文标签标注
# -Ochamame为茶まめ网站(https://chamame.ninjal.ac.jp/)的输出格式
# 更多格式可在dicrc中进行自定义
tagger1 = MeCab.Tagger('-r nul -d {} -Owakati'.format(dic_path).replace('\\','/'))
tagger2 = MeCab.Tagger('-r nul -d {} -Ochasen'.format(dic_path).replace('\\','/'))
# {} .format()函数，可将{}替换为()里的内容，用法示例如下：
# {a},{b},{c} .format(c=1,a=2,b=3)
# 定义文本文件名
FILE_NAME = "Mecab.txt"
# 如果有文本文件存在，则以rb+模式(二进制读写模式)打开读取句子数量标记n
# a代表追加，w代表覆盖写入，r代表只读
# 字母后加个+则代表读写均可以，字母后加个b则代表二进制格式
if os.path.exists(FILE_NAME) == True :
     with open(FILE_NAME, "rb+") as f:
# 设置初始偏移量为10字节
           offset = -10
           while True:
# file.seek(off, whence)：从文件中移动off个操作标记（文件指针），正往结束方向移动，负往开始方向移动。
# whence参数默认为0，可以自由设定，0代表从头开始，1代表当前位置，2代表文件最末尾位置。
# 如果前面用r+模式(文本读写模式)打开文件，则只能用whence=0的模式，无法从末尾开始。 
# 这里即从最末尾开始往前数10个字节放置指针
                f.seek(offset, 2)
# 读取文件指针范围10个字节内所有行的数据
# readline()读取一行的数据作为字符串并将指针移到下一行，readlines()读取指针后所有行的数据放入数组
# readlines()[-1]得到数组最后一个元素即最后一行数据放入字符串，同理[-2]代表倒数第二行，[0]代表第一行
                lines = f.readlines()
# 如果行数大于等于2，则说明最后一行已读取完整，跳出循环，否则偏移量乘2后继续循环
# 读取最后一行的值加一给赋予变量n，更新句子数，然后删除最后一行的数量标记
# len()字符串得到字符串长度，len()数组得到元素个数
                if len(lines) >= 2:
                     last_line = str(lines[-1]).replace("b", "").replace("'", "")
                     n = int(last_line)
                     break
                offset *= 2
# 重新搜索最后一行，用truncate()截断数据来删除最后一行的数量标记
# os.SEEK_END也可以代表从末尾开始；偏移量由读取到的实际字符数决定
           offset = -len(str(n))
           f.seek(offset ,os.SEEK_END)
           f.truncate()
# 没有获取到文本文件，则赋予n=1，代表第一个句子
else : n = 1
# 进入用户数据采集阶段
while n > 0:
     print("请输入任意句子，空行回车结束：")
# 定义字符串为空，作为输入的开始
     string = ''
# iter(object, sentinel)函数用来生成迭代器
# object代表需要迭代的集合对象，例如一个数组或一个函数
# sentinel为可选值，当object为可调用对象如函数时此值才可填，返回值与此值相等时迭代停止
# 此处用空作为sentinel，即空行回车后迭代停止
     for s in iter(input, ''):
          string += (s+'\n')
# 将获得的字符串分割为数组，一个元素为一个句子(段落)，然后读取句子(段落)数量
     sentences = string.split()
     sentence_num = len(sentences)
# 根据获得的句子(段落)个数，进行对应次数的分词处理，并写入文本文件中
     i = 0
     while i < sentence_num :
# 将第i个元素提取出来，去除换行符
          sentence = sentences[i].replace('\n','')
# 处理原始数据，其中模式1数据分割成字符串数组，模式2数据则维持词典输出形式
          parse1 = tagger1.parse(sentence).split()
          parse2 = tagger2.parse(sentence)
# 将处理结果以追加模式写入文本文件
          with open(FILE_NAME, "a", encoding="utf-8") as f:
               f.write("原句 " + str(n+i) + " :")
               f.write('\r\n')
               f.write(sentence)
               f.write('\r\n')
               f.write("分词结果：")
               f.write('\r\n')
               f.write(str(parse1))# 以字符串形式将数组写入文本
               f.write('\r\n')
               f.write("[分词 读音 原型词 词性] :")
               f.write('\r\n')
               f.write(str(parse2))
               f.write('\r\n')
# 将处理结果显示在控制台
          print("原句：" + sentence)
          print("分词结果：" + str(parse1))
          print("[分词 读音 原型词 词性] :")
          print(str(parse2))
          i = i + 1
# 句子计数增加i
     n += i
# 询问用户是否继续输入,并判断是否输入错误
     ASK = 1
     while ASK == 1 :
           ANWSER = input("是否继续输入:y or n 回答：")
           if ANWSER == "y":
                break
           elif ANWSER == "Y":
                break
           elif ANWSER == "n":
                break
           elif ANWSER == "N":
                break
           else: ASK = 1
     if ANWSER == "y":
          print('\r\n')
     elif ANWSER == "Y":
          print('\r\n')
     else : break
# 将句子数量写入最后一行作为标记，方便后续追加句子计数
with open(FILE_NAME, "a", encoding="utf-8") as f:
     f.write(str(n))
# 用记事本打开文本文件
print("即将用记事本显示分词结果")
os.system("notepad.exe Mecab.txt")
# 询问用户是否删除文件,并判断是否输入错误
while ASK == 1 :
      ANWSER = input("是否删除 Mecab.txt 文件:y or n 回答：")
      if ANWSER == "y":
           os.remove("Mecab.txt")
           quit()
      elif ANWSER == "Y":
           os.remove("Mecab.txt")
           quit()
      elif ANWSER == "n":
           quit()
      elif ANWSER == "N":
           quit()
      else: ASK = 1