master d68dbfdf6d06 cached
10 files
52.1 MB
18.7k tokens
17 symbols
1 requests
Download .txt
Repository: liuhuanyong/ChineseTextualInference
Branch: master
Commit: d68dbfdf6d06
Files: 10
Total size: 52.1 MB

Directory structure:
gitextract_m2r4jf8s/

├── .idea/
│   ├── misc.xml
│   ├── modules.xml
│   ├── textualEntailenent.iml
│   ├── vcs.xml
│   └── workspace.xml
├── README.md
├── data/
│   └── train.txt
├── lstm_train.py
├── model/
│   └── vocab.txt
└── translate_duba.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.6.3 (~/anaconda3/bin/python)" project-jdk-type="Python SDK" />
</project>

================================================
FILE: .idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/.idea/textualEntailenent.iml" filepath="$PROJECT_DIR$/.idea/textualEntailenent.iml" />
    </modules>
  </component>
</project>

================================================
FILE: .idea/textualEntailenent.iml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
  <component name="NewModuleRootManager">
    <content url="file://$MODULE_DIR$" />
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
  </component>
  <component name="TestRunnerService">
    <option name="projectConfiguration" value="Nosetests" />
    <option name="PROJECT_TEST_RUNNER" value="Nosetests" />
  </component>
</module>

================================================
FILE: .idea/vcs.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="VcsDirectoryMappings">
    <mapping directory="$PROJECT_DIR$" vcs="Git" />
  </component>
</project>

================================================
FILE: .idea/workspace.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ChangeListManager">
    <list default="true" id="e151fde8-248a-458d-a5f7-531c8b11572b" name="Default" comment="">
      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/image/project_route.png" />
      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/vcs.xml" />
      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/README.md" afterPath="$PROJECT_DIR$/README.md" />
    </list>
    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
    <option name="TRACKING_ENABLED" value="true" />
    <option name="SHOW_DIALOG" value="false" />
    <option name="HIGHLIGHT_CONFLICTS" value="true" />
    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
    <option name="LAST_RESOLUTION" value="IGNORE" />
  </component>
  <component name="FileEditorManager">
    <leaf>
      <file leaf-file-name="lstm_train.py" pinned="false" current-in-tab="false">
        <entry file="file://$PROJECT_DIR$/lstm_train.py">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="136">
              <caret line="204" column="31" lean-forward="false" selection-start-line="204" selection-start-column="31" selection-end-line="204" selection-end-column="31" />
              <folding />
            </state>
          </provider>
        </entry>
      </file>
      <file leaf-file-name="README.md" pinned="false" current-in-tab="true">
        <entry file="file://$PROJECT_DIR$/README.md">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="243">
              <caret line="144" column="0" lean-forward="false" selection-start-line="144" selection-start-column="0" selection-end-line="144" selection-end-column="0" />
              <folding />
            </state>
          </provider>
        </entry>
      </file>
      <file leaf-file-name="train.txt" pinned="false" current-in-tab="false">
        <entry file="file://$PROJECT_DIR$/data/train.txt">
          <provider selected="true" editor-type-id="LargeFileEditor">
            <state relative-caret-position="360">
              <caret line="548" column="38" lean-forward="false" selection-start-line="534" selection-start-column="0" selection-end-line="548" selection-end-column="38" />
            </state>
          </provider>
        </entry>
      </file>
      <file leaf-file-name="translate_duba.py" pinned="false" current-in-tab="false">
        <entry file="file://$PROJECT_DIR$/translate_duba.py">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="162">
              <caret line="10" column="19" lean-forward="false" selection-start-line="4" selection-start-column="0" selection-end-line="34" selection-end-column="21" />
              <folding />
            </state>
          </provider>
        </entry>
      </file>
    </leaf>
  </component>
  <component name="Git.Settings">
    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
  </component>
  <component name="IdeDocumentHistory">
    <option name="CHANGED_PATHS">
      <list>
        <option value="$PROJECT_DIR$/README.md" />
      </list>
    </option>
  </component>
  <component name="ProjectFrameBounds">
    <option name="x" value="129" />
    <option name="y" value="490" />
    <option name="width" value="1366" />
    <option name="height" value="701" />
  </component>
  <component name="ProjectView">
    <navigator currentView="ProjectPane" proportions="" version="1">
      <flattenPackages />
      <showMembers />
      <showModules />
      <showLibraryContents />
      <hideEmptyPackages />
      <abbreviatePackageNames />
      <autoscrollToSource />
      <autoscrollFromSource />
      <sortByType />
      <manualOrder />
      <foldersAlwaysOnTop value="true" />
    </navigator>
    <panes>
      <pane id="ProjectPane">
        <subPane>
          <expand>
            <path>
              <item name="textualEntailenent" type="b2602c69:ProjectViewProjectNode" />
              <item name="textualEntailenent" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="textualEntailenent" type="b2602c69:ProjectViewProjectNode" />
              <item name="textualEntailenent" type="462c0819:PsiDirectoryNode" />
              <item name="data" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="textualEntailenent" type="b2602c69:ProjectViewProjectNode" />
              <item name="textualEntailenent" type="462c0819:PsiDirectoryNode" />
              <item name="DataTranslate" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="textualEntailenent" type="b2602c69:ProjectViewProjectNode" />
              <item name="textualEntailenent" type="462c0819:PsiDirectoryNode" />
              <item name="image" type="462c0819:PsiDirectoryNode" />
            </path>
          </expand>
          <select />
        </subPane>
      </pane>
      <pane id="Scratches" />
      <pane id="Scope" />
    </panes>
  </component>
  <component name="PropertiesComponent">
    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
    <property name="SearchEverywhereHistoryKey" value="&#9;FILE&#9;file:///home/lhy/Desktop/textualEntailenent/lstm_train.py" />
  </component>
  <component name="RecentsManager">
    <key name="CopyFile.RECENT_KEYS">
      <recent name="$PROJECT_DIR$/image" />
    </key>
  </component>
  <component name="RunDashboard">
    <option name="ruleStates">
      <list>
        <RuleState>
          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
        </RuleState>
        <RuleState>
          <option name="name" value="StatusDashboardGroupingRule" />
        </RuleState>
      </list>
    </option>
  </component>
  <component name="ShelveChangesManager" show_recycled="false">
    <option name="remove_strategy" value="false" />
  </component>
  <component name="TaskManager">
    <task active="true" id="Default" summary="Default task">
      <changelist id="e151fde8-248a-458d-a5f7-531c8b11572b" name="Default" comment="" />
      <created>1543386724429</created>
      <option name="number" value="Default" />
      <option name="presentableId" value="Default" />
      <updated>1543386724429</updated>
    </task>
    <servers />
  </component>
  <component name="ToolWindowManager">
    <frame x="129" y="490" width="1366" height="701" extended-state="0" />
    <layout>
      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.24963397" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
      <window_info id="Python Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
      <window_info id="Data View" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
      <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
      <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
      <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
      <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
      <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
    </layout>
  </component>
  <component name="VcsContentAnnotationSettings">
    <option name="myLimit" value="2678400000" />
  </component>
  <component name="XDebuggerManager">
    <breakpoint-manager />
    <watches-manager />
  </component>
  <component name="editorHistoryManager">
    <entry file="file://$PROJECT_DIR$/translate_duba.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="162">
          <caret line="10" column="19" lean-forward="false" selection-start-line="4" selection-start-column="0" selection-end-line="34" selection-end-column="21" />
          <folding />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/data/train.txt">
      <provider selected="true" editor-type-id="LargeFileEditor">
        <state relative-caret-position="360">
          <caret line="548" column="38" lean-forward="false" selection-start-line="534" selection-start-column="0" selection-end-line="548" selection-end-column="38" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/lstm_train.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="136">
          <caret line="204" column="31" lean-forward="false" selection-start-line="204" selection-start-column="31" selection-end-line="204" selection-end-column="31" />
          <folding />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/README.md">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="243">
          <caret line="144" column="0" lean-forward="false" selection-start-line="144" selection-start-column="0" selection-end-line="144" selection-end-column="0" />
          <folding />
        </state>
      </provider>
    </entry>
  </component>
</project>

================================================
FILE: README.md
================================================
# ChineseTextualInference
ChineseTextualInference project including chinese corpus build and inferecence model, 中文文本推断项目,包括88万文本蕴含中文文本蕴含数据集的翻译与构建,基于深度学习的文本蕴含判定模型构建.

# 项目介绍

  文本间的推理关系,又称为文本蕴含关系 (TextualEntailment),作为一种基本的文本间语义联系,广泛存在于自然语言文本中。简单的来说文本蕴含关系描述的是两个文本之间的推理关系,其中一个文本作为前提(premise),另一个文本作为假设(hypothesis),如果根据前提P能够推理得出假设H,那么就说P蕴含H,记做P->H,这跟一阶逻辑中的蕴含关系是类似的。  
    目前关于文本蕴含还存在两个问题:  
    一,中文文本蕴含数据集严重匮乏  
    目前,关于文本蕴含的研究主要还是集中在英文,如评测中常常使用的SNLI数据集与MultiNIL:  
    1) The Stanford Natural Language Inference (SNLI) 是斯坦福大学NLP组发布的文本蕴含识别的数据集。SNLI由人工标注的,一共包含570K个文本对,其中训练集550K,验证集10K,测试集10K,一共包含三类entailment,contradiction,neutra,上节提到的例子就是出自此数据集  
    2) The Multi-Genre Natural Language Inference (MultiNLI)是一个众包数据集,包含433k个文本对。  

   然而,在中文中,还没有出现大规模的文本蕴含数据集, CCL2018有一个文本蕴含的评测,由北京语言大学于东老师团队组织的,发布了一个数量级为10W的评测集,这是目前最大的一个文本蕴含数据集,与英文还有很大的差距。  
   二,语言之间存在根本性差异  
    在英文SNIL数据集中,准确率已经达到将近90%,这个准确率是在50W+数据集上得到的,而中文与英文有实质性差异,英文的文本蕴含模型无法直接应用到中文的文本蕴含当中,我们需要在中文上做技术上的PK,做本土化的创新.  
    
   因此,本项目将尝试完成两个任务:  
    一, 完成与SNIL规模相当的中文文本蕴含数据集  
    二, 基于构建起的中文文本蕴含数据集, 尝试完成模型实验  

# 项目架构
![image](https://github.com/liuhuanyong/ChineseTextualInference/blob/master/image/project_route.png)

# 中文文本蕴含数据集构建
1,英文文本蕴含数据

    A snowboarder on a wide plain of snow	A snow field with a snowboarder on it	entailment
    A snowboarder on a wide plain of snow	A snowboarder gliding over a field of snow	neutral
    A snowboarder on a wide plain of snow	A snowmobile in a blizzard	neutral
    An older women tending to a garden.	The lady is cooking dinner	contradiction
    An older women tending to a garden.	The lady is weeding her garden	neutral
    An older women tending to a garden.	The lady has a garden	entailment
    A man in a black shirt overlooking bike maintenance.	A man destroys a bike.	contradiction
    A man in a black shirt overlooking bike maintenance.	A man watches bike repairs.	entailment
    A man in a black shirt overlooking bike maintenance.	A man learns bike maintenance.	neutral
    A man in a black shirt is looking at a bike in a workshop.	A man is wearing a red shirt	contradiction
    A man in a black shirt is looking at a bike in a workshop.	A man is in a black shirt	entailment
    A man in a black shirt is looking at a bike in a workshop.	A man is deciding which bike to buy	neutral



2,中英文文本语料翻译
translate_duba.py

    class Translate:
        def __init__(self):
            return

        '''获取html'''
        def get_html(self, url):
            headers = {
                'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                              r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
                'Connection': 'keep-alive'
            }
            req = request.Request(url, headers=headers)
            page = request.urlopen(req).read()
            page = page.decode('utf-8')
            return page

        '''解析翻译答案'''
        def extract_answers(self, content):
            selector = etree.HTML(content)
            answer = selector.xpath('//div[@class="in-base"]/div/div/text()')[0]
            return answer

        '''翻译主函数'''
        def translate(self, query):
            url = 'http://www.iciba.com/{}'.format(query)
            html = self.get_html(url)
            try:
                answer = self.extract_answers(html)
            except Exception as e:
                answer = query
            return answer

3,翻译后中文文本蕴含数据集

    一名身穿灰色T恤的男子站在一辆卡车和一棵小树的停车收费表旁边。	这辆卡车是绿色的。	neutral
    摩托车排成一排,靠在一座建筑物上。	停车场里到处都是汽车。	contradiction
    一男一女在街角接吻。	一对男女在接吻。	entailment
    一名身穿绿色制服,手里拿着球的足球运动员被他的一些队友举起,而另一名穿红色球衣的球员则伸手去接球。	这位绿色球员受伤了,他的队友正在帮助他。	neutral
    一个男人坐在阳光下,坐在长凳上,弹着班卓琴,而一只加拿大鹅看着。	有个人站着弹吉他。	contradiction
    一个棕色头发的女人,对着麦克风唱歌。	一个女人唱歌。	entailment
    一位穿着深色外套的女士正坐着,身边有许多人。	一位女士正试图在节日举行饮食比赛。	neutral
    一位水泥工人正在一家服装店外的一条新人行道上工作。	一名工人在工作。	contradiction
    巴尔从后板凳上扔出莫洛托夫鸡尾酒,就像金里奇曾经做过的那样。	金里奇和巴尔都把莫洛托夫鸡尾酒从后排扔出去了。	entailment
    一群儿童和成年人在树林里的一条土路上骑自行车。	一个家庭在乡下骑自行车。	neutral
    两个人手拿着一根杆子在外面工作。	两个男人在外面捕鲸。	contradiction
    这是一张男人睡在墙上或冥想的照片。	一个人在墙附近。	entailment
    当三个人经过时,人行道上有建筑。	他们最近拆毁了那里的一座建筑物。	neutral
    老太太坐在满是鲜花的房间里。	这位老太太正在厨房里做蛋糕。	contradiction
    游泳者潜入蓝色游泳池水中。	有一个人在水里。	entailment


4, 中英文文本蕴含数据集规模

   | 语言类型 | 句子数 | 蕴含句子对数|
   |:---: | :---: | :---: |
   |中文 | 100W | 88W |
   |英文 | 116W | 96W |



# 中文文本蕴含模型实验
本实验采用两个双向LSTM对前提Premise和假设hypothsis进行编码,最周将两个句子表征进行拼接,送入全连接层进行三分类
1, 网络层如下:

        embedding_layer = Embedding(self.VOCAB_SIZE + 1,
                                    self.EMBEDDING_DIM,
                                    weights=[self.embedding_matrix],
                                    input_length=self.TIME_STAMPS,
                                    trainable=False,
                                    mask_zero=True)
        left_input = Input(shape=(self.TIME_STAMPS,), dtype='float32')
        right_input = Input(shape=(self.TIME_STAMPS,), dtype='float32')
        encoded_left = embedding_layer(left_input)
        encoded_right = embedding_layer(right_input)
        shared_lstm = self.create_base_network(input_shape=(self.TIME_STAMPS, self.EMBEDDING_DIM))
        left_output = shared_lstm(encoded_left)
        right_output = shared_lstm(encoded_right)
        merged = concatenate([left_output, right_output], axis=-1)
        merged = Dropout(0.3)(merged)
        merged = BatchNormalization()(merged)
        pred = Dense(self.NUM_CLASSES, activation='softmax', name='softmax_prediction')(merged)
        optimizer = SGD(lr=0.001, momentum=0.9)
        model = Model(inputs=[left_input, right_input], outputs=pred)
        model.compile(loss='categorical_crossentropy',
                      optimizer=optimizer,
                      metrics=['accuracy'])
        model.summary()

2, 实验结果

   | 模型 | 训练集 | 测试集| 训练集准确率| 测试集准确率|
   |:---: | :---: | :---: | :---: | :---: |
   | Bilstm| 30w | 10W | 0.56|0.54|

# 总结
1, 本项目针对中文文本蕴含数据集数量不足的问题,提出了一个中文文本蕴含数据集,规模达到88W  
2, 借助翻译方法进行英文中文转换,前提是英文句子较为短小,短句的翻译效果还是不错的  
3, 原先打算使用百度API进行翻译,但是使用次数有限制,因此转而以金山毒霸代之,使用在线翻译结果  
4, 本项目实现了一个以LSTM进行文本蕴含三分类的模型,准确率不是很高,只有0.54左右,后期还有很大的优化空间  

# contact 
如有自然语言处理、知识图谱、事理图谱、社会计算、语言资源建设等问题或合作,请联系我:  
邮箱:lhy_in_blcu@126.com  
csdn:https://blog.csdn.net/lhy2014  
我的自然语言处理项目: https://liuhuanyong.github.io/  
刘焕勇,中国科学院软件研究所,lhy_in_blcu@126.com  



    
    


================================================
FILE: data/train.txt
================================================
[File too large to display: 52.1 MB]

================================================
FILE: lstm_train.py
================================================
#!/usr/bin/env python3
# coding: utf-8
# File: siamese_train.py
# Author: lhy<lhy_in_blcu@126.com,https://huangyong.github.io>
# Date: 18-5-23

import numpy as np
from keras import backend as K
from keras.preprocessing.sequence import pad_sequences
from keras.optimizers import Adam,SGD
from keras.utils import to_categorical, plot_model
from keras.models import Sequential, Model, load_model
from keras.layers import Embedding, Dense, Input, Dropout, Reshape, BatchNormalization, TimeDistributed, Lambda, Layer, LSTM, Bidirectional, Average, concatenate
import matplotlib.pyplot as plt
import os
from collections import Counter

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

class SiameseNetwork:
    def __init__(self):
        cur = '/'.join(os.path.abspath(__file__).split('/')[:-1])
        self.class_dict ={
                         'neutral':0,
                         'entailment': 1,
                         'contradiction': 2,
                         }
        self.train_path = os.path.join(cur, 'data/train.txt')
        self.test_path = os.path.join(cur, 'data/test.txt')
        self.vocab_path = os.path.join(cur, 'model/vocab.txt')
        self.embedding_file = os.path.join(cur, 'model/token_vec_300.bin')
        self.model_path = os.path.join(cur, 'tokenvec_bilstm2_model.h5')
        self.datas, self.word_dict = self.build_data()
        self.EMBEDDING_DIM = 300
        self.EPOCHS = 20
        self.BATCH_SIZE = 512
        self.LIMIT_RATE = 0.95
        self.NUM_CLASSES = len(self.class_dict)
        self.VOCAB_SIZE = len(self.word_dict)
        self.TIME_STAMPS = self.select_best_length()
        self.embedding_matrix = self.build_embedding_matrix()

    '''根据样本长度,选择最佳的样本max-length'''
    def select_best_length(self):
        len_list = []
        max_length = 0
        cover_rate = 0.0
        sent_list = set()
        for line in open(self.train_path):
            line = line.strip().split('\t')
            if len(line) < 3:
                continue
            sent1 = line[0]
            sent2 = line[1]
            sent_list.add(sent1)
            sent_list.add(sent2)

        for sent in sent_list:
            sent_len = len(sent)
            len_list.append(sent_len)
        all_sent = len(len_list)
        sum_length = 0
        len_dict = Counter(len_list).most_common()
        for i in len_dict:
            sum_length += i[1] * i[0]
        average_length = sum_length / all_sent
        for i in len_dict:
            rate = i[1] / all_sent
            cover_rate += rate
            if cover_rate >= self.LIMIT_RATE:
                max_length = i[0]
                break
        print('average_length:', average_length)
        print('max_length:', max_length)
        return max_length

    '''构造数据集'''
    def build_data(self):
        sample_y = []
        sample_x_left = []
        sample_x_right = []
        vocabs = {'UNK'}
        count = 0
        for line in open(self.train_path):
            line = line.rstrip().split('\t')
            if not line or len(line)<3:
                continue
            sent_left = line[0]
            sent_right = line[1]
            label = line[2]
            if label not in self.class_dict:
                continue
            sample_x_left.append([char for char in sent_left if char])
            sample_x_right.append([char for char in sent_right if char])
            sample_y.append(label)
            for char in [char for char in sent_left + sent_right if char]:
                vocabs.add(char)
            count += 1
            if count%10000 == 0:
                print(count)
        print(len(sample_x_left), len(sample_x_right))
        sample_x = [sample_x_left, sample_x_right]
        datas = [sample_x, sample_y]
        word_dict = {wd:index for index, wd in enumerate(list(vocabs))}
        self.write_file(list(vocabs), self.vocab_path)
        return datas, word_dict

    '''将数据转换成keras所需的格式'''
    def modify_data(self):
        sample_x = self.datas[0]
        sample_y = self.datas[1]
        sample_x_left = sample_x[0]
        sample_x_right = sample_x[1]
        left_x_train = [[self.word_dict[char] for char in data] for data in sample_x_left]
        right_x_train = [[self.word_dict[char] for char in data] for data in sample_x_right]
        y_train = [self.class_dict.get(i) for i in sample_y]
        left_x_train = pad_sequences(left_x_train, self.TIME_STAMPS)
        right_x_train = pad_sequences(right_x_train, self.TIME_STAMPS)
        y_train = to_categorical(y_train, num_classes=3)
        return left_x_train, right_x_train, y_train

    '''保存字典文件'''
    def write_file(self, wordlist, filepath):
        with open(filepath, 'w+') as f:
            f.write('\n'.join(wordlist))

    '''加载预训练词向量'''
    def load_pretrained_embedding(self):
        embeddings_dict = {}
        with open(self.embedding_file, 'r') as f:
            for line in f:
                values = line.strip().split(' ')
                if len(values) < 300:
                    continue
                word = values[0]
                coefs = np.asarray(values[1:], dtype='float32')
                embeddings_dict[word] = coefs
        print('Found %s word vectors.' % len(embeddings_dict))
        return embeddings_dict

    '''加载词向量矩阵'''
    def build_embedding_matrix(self):
        embedding_dict = self.load_pretrained_embedding()
        embedding_matrix = np.zeros((self.VOCAB_SIZE + 1, self.EMBEDDING_DIM))
        for word, i in self.word_dict.items():
            embedding_vector = embedding_dict.get(word)
            if embedding_vector is not None:
                embedding_matrix[i] = embedding_vector
        return embedding_matrix

    '''搭建编码层网络,用于权重共享'''
    def create_base_network(self, input_shape):
        input = Input(shape=input_shape)
        lstm1 = Bidirectional(LSTM(128, return_sequences=True))(input)
        lstm1 = Dropout(0.5)(lstm1)
        lstm2 = Bidirectional(LSTM(64))(lstm1)
        lstm2 = Dropout(0.5)(lstm2)
        return Model(input, lstm2)

    '''搭建网络'''
    def bilstm_siamese_model(self):
        embedding_layer = Embedding(self.VOCAB_SIZE + 1,
                                    self.EMBEDDING_DIM,
                                    weights=[self.embedding_matrix],
                                    input_length=self.TIME_STAMPS,
                                    trainable=False,
                                    mask_zero=True)
        left_input = Input(shape=(self.TIME_STAMPS,), dtype='float32')
        right_input = Input(shape=(self.TIME_STAMPS,), dtype='float32')
        encoded_left = embedding_layer(left_input)
        encoded_right = embedding_layer(right_input)
        shared_lstm = self.create_base_network(input_shape=(self.TIME_STAMPS, self.EMBEDDING_DIM))
        left_output = shared_lstm(encoded_left)
        right_output = shared_lstm(encoded_right)
        merged = concatenate([left_output, right_output], axis=-1)
        merged = Dropout(0.3)(merged)
        merged = BatchNormalization()(merged)
        pred = Dense(self.NUM_CLASSES, activation='softmax', name='softmax_prediction')(merged)
        optimizer = SGD(lr=0.001, momentum=0.9)
        model = Model(inputs=[left_input, right_input], outputs=pred)
        model.compile(loss='categorical_crossentropy',
                      optimizer=optimizer,
                      metrics=['accuracy'])
        model.summary()
        return model

    '''训练模型'''
    def train_model(self):
        left_x_train, right_x_train, y_train = self.modify_data()
        model = self.bilstm_siamese_model()
        history = model.fit(
                              x=[left_x_train, right_x_train],
                              y=y_train,
                              validation_split=0.25,
                              batch_size=self.BATCH_SIZE,
                              epochs=self.EPOCHS,
                            )
        self.draw_train(history)
        model.save(self.model_path)
        return model

    '''绘制训练曲线'''
    def draw_train(self, history):
        plt.plot(history.history['acc'])
        plt.plot(history.history['val_acc'])
        plt.title('Model accuracy')
        plt.ylabel('Accuracy')
        plt.xlabel('Epoch')
        plt.legend(['Train', 'Test'], loc='upper left')
        plt.show()
        # Plot training & validation loss values
        plt.plot(history.history['loss'])
        plt.plot(history.history['val_loss'])
        plt.title('Model loss')
        plt.ylabel('Loss')
        plt.xlabel('Epoch')
        plt.legend(['Train', 'Test'], loc='upper left')
        plt.show()

handler = SiameseNetwork()
handler.train_model()



================================================
FILE: model/vocab.txt
================================================
编
念
恺
娘
颈
悬
璜
凄
垂
苛
(
惜
橙
焚
潘
蜈
息
井
儿
顷
碎
砸
奄
鞋
辋
单
妈
谱
蒙
姬
斡
凸
渡
撑
肮
咖
缴
:
翠
违
兆
晴
乃
呕
懊
雪
沐
趾
O
挚
狈
葛
春
塞
梁
坐
码
超
吧
棘
萃
窝
日
配
变
锻
克
蘖
赠
D
搂
骆
笺
司
遮
吁
侦
践
啜
泣
澳
堕
押
引
扑
蜕
吾
倍
佳
弹
激
辞
般
易
洪
甚
芳
湛
帽
猖
腑
淋
吟
报
蹲
惨
骗
钴
UNK
钠
菲
逐
悼
悖
/
料
涌
瓷
耦
麒
昭
刷
赫
饭
侨
惺
群
含
夯
庞
募
放
评
虱
迥
纲
富
迷
疆
撞
宙
芭
蕾
灼
证
越
陌
商
戈
α
抓
都
U
悔
痴
俊
榈
貂
傲
僚
斗
缕
鲨
险
殖
褶
吵
骸
遗
虔
*
颅
养
砾
捍
草
啤
獒
匀
曝
序
显
皑
爷
策
塘
幅
彻
橇
品
还
感
捧
峻
婊
们
办
悟
用
韧
看
嫉
澡
胃
挤
饪
茂
萧
溅
瑜
蹴
咒
版
玻
摘
轮
酱
周
歪
裙
按
令
k
返
谁
墓
豪
珠
股
鳌
精
临
网
"
所
培
岩
礁
脂
忽
沿
呢
萨
曼
舌
馈
蚓
寮
飙
瑰
鹫
消
愤
屯
钯
瞅
访
睹
泞
堡
怒
潇
斋
娶
棺
雄
胸
骼
魇
效
送
是
悦
县
生
睫
沛
友
踵
侈
嗡
二
照
浚
爬
芜
川
怂
侏
集
麟
纷
吼
漾
蚕
对
髋
髦
脾
估
毛
Q
路
鱼
�
掌
低
它
客
葫
树
浪
差
猿
跻
?
辈
膺
垫
麽
狙
避
憎
戒
菖
却
搞
泳
空
翡
箍
廊
愕
蔼
谑
臣
腐
冻
明
艳
帚
v
闩
躬
骄
件
辙
逝
傀
出
巢
逃
篇
厕
昨
烁
傅
份
惹
肢
桅
荔
酥
枷
接
漱
听
丈
铅
哔
跌
玺
奶
舒
痕
完
颧
竣
刽
倡
秃
芯
呈
瞧
舍
祟
苦
媒
阈
妒
诽
嫁
俏
灯
验
舞
形
恶
哲
汹
迎
酸
纯
茫
只
大
撕
共
跤
捡
堰
莴
气
宇
专
腿
崔
痿
畜
屠
绽
跋
跨
军
秒
嘶
咨
购
锋
×
馏
厢
狼
逆
漂
甜
脐
卷
殿
渲
轻
华
戴
菇
各
扉
扔
艰
œ
直
残
患
奠
磐
痹
蔚
牛
弊
杆
齐
烈
黝
撰
濒
委
诫
蛮
治
趋
到
努
搡
犀
得
灵
肺
瞳
横
弃
多
桦
滤
泌
畸
熨
闹
睦
票
牵
昌
堑
攒
砧
阀
蜢
à
麝
廉
石
陀
饮
卖
发
肖
袒
聆
察
润
刹
见
阂
拓
侵
阐
循
嘉
帘
焙
P
刺
薰
省
贩
迁
夫
胆
珊
习
鞍
罕
螳
帮
途
拒
木
姜
竿
嗤
唁
脚
冗
咯
孤
邻
扰
忧
怜
此
憩
潴
醚
康
胎
鳍
吉
月
痪
孟
订
矸
渔
莽
彦
游
砂
沉
邮
琉
长
落
裂
逛
拟
妖
员
神
略
潜
蚱
佃
?
软
满
杠
裱
很
极
京
积
者
假
矶
伯
柴
兢
跚
橘
靶
来
充
伟
彼
魅
尬
洲
庐
土
权
轩
愁
驴
普
疣
税
绘
荼
绕
薯
音
虹
臃
埚
雅
议
鲶
犬
私
踮
美
车
烙
场
读
干
鸟
浃
厦
东
驼
纫
岭
掀
抖
肆
蕊
王
纸
陷
清
鲤
蜂
育
殷
吻
队
镯
喇
卒
换
钹
忘
蓖
瓮
桐
舔
灰
辱
晤
胫
立
牒
挖
椭
凡
煮
忡
铭
鼬
棠
琼
哮
莱
宏
沥
顿
岳
稠
果
!
[
卧
鸭
卑
冉
其
嚎
冬
拷
悠
诵
豆
饲
要
采
屋
抄
叽
冯
岸
喋
销
种
著
延
蛛
酵
罐
智
定
瞩
幢
寂
红
会
凳
祭
皙
蟾
构
弦
岌
倦
质
晓
缠
本
哨
汽
袜
绿
涨
皇
扎
恼
八
佑
腻
柚
进
操
奔
猕
栗
谷
柑
阑
卵
砥
禁
蟑
支
鉴
涵
侬
箱
怯
爸
滚
壮
瘾
矿
关
步
审
景
疹
嘘
镶
奕
羚
π
缉
稽
豁
汗
闺
镖
扼
匕
运
辰
棉
曳
拿
今
什
捐
协
、
征
才
徒
骑
冷
谚
盟
绞
规
欺
耕
敞
瘦
萝
溢
欠
拨
驳
慷
塔
柯
腹
氢
页
淑
掺
呃
恢
崖
僧
浓
咽
江
泵
妨
补
女
g
灿
弟
层
己
蔓
泼
叉
惭
町
盘
祉
熏
惧
雨
酋
孵
K
鳕
界
苟
矮
熊
待
屹
撇
希
鳞
涤
蜓
侪
凯
耸
觅
盖
术
笃
浊
粼
嘴
绎
亥
墙
间
迅
朝
挨
敬
咄
唾
翻
枕
街
怡
夺
命
W
雾
涯
蛆
宫
辜
膝
禄
地
核
奉
凰
瑕
疼
啃
锦
赘
胀
谍
媳
雌
蛎
烤
逞
随
吐
争
士
眶
嘿
菅
鸿
6
缄
镭
蝗
题
再
漪
勒
豚
龙
巫
彗
舆
隶
翼
娱
眩
攸
腌
应
薇
正
如
圣
诟
谈
降
岑
割
诈
竺
w
弱
伴
盯
阁
笋
枣
敖
好
症
弄
遭
酰
厩
姻
轧
氨
思
拂
雇
达
寥
炎
$
淇
你
腾
式
鹏
茵
宰
既
圈
邀
鹑
串
腋
最
法
韵
参
丑
第
钙
脸
焰
8
腔
巨
睛
愚
伐
剩
档
纱
苗
隆
呼
窑
图
螃
赋
入
钉
魔
饶
秽
烯
幼
吓
台
门
缎
媚
谐
蔽
虚
谜
键
娅
埔
握
数
校
糊
犸
绰
伶
蝎
钟
柜
帷
歌
申
和
福
闭
改
陪
胺
藻
恤
罂
龄
暇
履
1
逾
酌
鳏
旧
焊
匙
属
六
铣
尿
骤
捉
座
m
夸
火
嘛
赌
睡
找
利
啊
澈
氟
蝉
穴
勋
跑
蒜
尸
秘
武
携
仙
跪
蟹
钢
声
穿
败
辣
触
惮
苑
失
耿
幌
葱
相
2
玫
虽
滞
熵
掏
咐
举
退
鸦
栽
求
偶
健
油
J
总
寝
嗨
丫
琐
踪
骏
睿
笛
魁
妓
氪
挡
惰
L
帝
戚
睬
役
嫌
溃
供
摸
技
救
瓢
叹
百
个
耳
窄
脏
沙
震
侍
魏
棚
伎
后
党
碍
扛
答
欲
欧
瘙
朗
灭
汤
鹤
算
耽
烩
这
哼
寒
注
头
摊
靠
蹒
衷
顾
压
聋
祠
澜
爽
蓿
鸣
严
碌
咏
慰
蹦
贪
瞒
把
4
脯
想
舀
崛
驹
跳
渍
茬
暴
匪
蜻
浸
窃
拾
寄
勺
苯
羯
怕
兮
椎
盏
佛
猴
何
窟
擎
俱
吗
饼
尴
赢
祝
郡
抚
机
守
符
镁
驭
必
默
奈
盎
纹
监
赂
亨
狗
拆
族
巡
详
过
颖
检
止
湿
菌
谕
许
蚣
振
氮
镑
茁
繁
辅
壑
倒
祈
臂
买
°
青
蜷
鲈
海
互
h
粉
楷
拙
乔
乙
丘
酊
鹌
醛
姊
帆
厉
附
斧
做
零
镐
主
悄
说
老
惯
耗
讹
絮
荒
乘
拣
叛
星
《
疱
抬
仪
柏
锌
孙
汪
歉
囱
鹰
萄
蜃
冥
掩
始
丸
妹
缤
拭
缮
钥
划
凉
坞
虫
胶
拖
溶
么
锐
宠
恐
诊
简
吠
铬
圭
奢
铜
均
札
戳
固
鳗
模
烦
渥
砺
厄
紊
针
麓
弓
羁
镗
跷
喉
痢
轨
鲍
桥
莎
管
耶
z
仁
脑
蹄
缚
镕
行
臭
殉
兄
中
连
>
阉
雷
尘
蜜
鹅
戛
身
套
贵
杖
控
便
楚
r
匠
赴
论
娥
吝
尊
产
萸
憔
脆
科
疾
酷
炬
邑
然
咆
咫
榨
掉
援
秋
漠
绩
铲
桑
狮
俾
框
匹
妻
活
E
剃
嗒
刀
吃
合
另
驾
雏
鼻
肿
影
河
,
霹
…
瓦
苏
赞
梭
可
佐
趁
愉
帅
兰
户
像
谅
苹
究
索
曲
功
言
蔡
尖
驶
肤
莲
戟
伍
烷
粘
桔
院
性
徊
纬
鼠
手
炫
源
叮
霾
悯
描
训
扶
霉
光
枉
危
狭
纠
I
缩
遏
取
蒸
鳟
锥
酗
妾
缸
蹩
欢
杭
害
赡
衬
册
匿
斩
研
冤
颌
猪
坦
刮
泽
胛
奖
护
贷
劝
猩
悍
炉
氏
怀
室
歹
储
赦
崩
增
噩
几
安
凝
奇
淤
尝
七
晾
城
煤
梅
硅
现
叭
郁
穹
牡
醋
瘤
伪
擂
郎
偿
椰
蜍
浏
伙
透
泰
鹿
池
昏
肃
怖
政
或
秤
薄
绥
烬
肉
锚
葩
锹
~
睐
酿
野
诗
函
苇
程
藓
隧
棱
坂
菜
扫
花
孝
缓
碾
愿
熟
整
拍
慕
刘
母
纳
瑙
圳
缀
敛
拱
俑
妮
谘
露
硬
龛
酝
昙
晕
X
槃
髻
蛤
并
筹
与
别
映
扁
沮
疵
颚
诡
由
拉
莓
岱
箴
减
替
豌
稻
亮
懒
献
棒
牺
跃
獾
栩
凹
迹
戮
醒
市
医
剖
坏
蜗
半
捷
结
解
靡
团
迄
5
:
芒
表
印
煦
鹕
诣
输
屁
阵
停
ó
托
俘
彬
巅
券
练
昂
祗
漫
窗
猝
撤
脊
鸡
澎
民
瓶
矛
九
歼
峡
镜
登
朴
债
讯
傻
扯
阻
缈
钻
灶
襟
尤
谧
诙
3
鄙
柠
望
圆
须
洗
膏
陡
Y
滋
萼
亭
肓
药
羔
厅
馀
永
溪
竞
妄
怪
卤
鞑
屈
亩
芹
磷
荚
藤
挥
黑
宾
赏
掘
调
玉
售
顽
奸
邱
挂
搓
槲
蛙
呐
啉
眨
陛
惠
鲱
仑
缺
俩
吕
毒
丰
屉
轴
馁
聚
痛
涕
猎
喱
狂
密
榕
沌
膨
&
额
础
峙
肥
蟀
蛇
蛭
亿
桉
嚏
类
笆
成
痨
诿
涸
汀
毅
业
釉
绸
淘
贫
官
李
啡
夕
讨
炙
c
蚂
谋
剑
雳
距
眺
信
反
少
阶
奎
喧
镳
乍
汲
巧
昼
阔
胁
愈
蕉
黛
萦
扩
尾
螯
镍
拴
卸
剪
偷
梨
嚼
槽
准
烂
等
瓣
银
裔
双
罩
因
氰
衍
滩
喔
彭
悴
菊
状
隔
边
传
为
至
缘
噱
逍
塑
将
妆
烘
劾
颐
酶
缆
迪
鬣
邓
义
擅
嵌
型
颇
否
剥
坩
着
藏
翁
葬
蚤
凌
纵
韩
荟
话
陆
幕
膜
辘
蝠
颊
展
点
腕
啁
=
局
咧
牙
姨
粪
久
量
崭
滔
袱
贾
杉
递
勃
那
钝
槌
端
皱
鹭
吹
V
黯
玄
浑
晦
淌
艮
筷
较
玩
向
渠
丝
茸
覆
泛
博
泪
僻
婉
适
崎
磋
啾
糖
链
称
坠
搜
淡
样
投
味
祷
疑
蔑
咎
府
迦
慌
藐
罔
坚
帜
侄
披
颠
铆
妊
洞
宛
垩
幻
巴
装
劫
流
掐
攫
据
拐
析
菱
色
饵
詹
疤
惩
骨
曹
诃
泻
寓
错
踩
暹
姓
滕
皿
奏
屡
卿
革
锢
温
络
偎
兑
哝
了
敌
咕
颂
咙
秆
营
e
艺
抒
指
炖
A
语
夜
咬
%
陋
蜒
米
秀
a
狠
财
词
插
艘
锄
够
宅
醇
去
聘
枢
遢
物
绒
猜
叫
同
稀
戎
建
硝
器
浇
宿
卉
呀
圃
u
烹
填
铎
瀚
诠
垮
诱
梦
牌
倾
课
异
淆
洛
制
豹
派
授
诬
乎
杜
聿
居
逗
腥
泡
慧
开
蚊
蜡
忆
兹
块
坟
恰
趴
墨
下
卡
染
碟
嗑
乞
脓
通
之
缝
孕
秸
鹊
提
倚
狒
喵
陶
宝
瀑
肌
乡
疫
纂
悉
启
羹
髓
脖
刊
喻
蹼
!
扒
簿
小
经
恨
潺
先
炒
蛀
捏
季
€
痰
颓
厘
起
铝
鼩
庭
黄
骇
暂
祸
湍
卦
噬
枚
盆
诩
轭
慑
袤
嗯
逊
跆
伏
荐
贬
瑚
躯
询
芥
唆
褐
刑
咱
蔗
氛
瓜
渴
酯
剽
b
屑
抛
喙
枫
遥
事
寸
甲
禅
钞
孚
匮
麦
跟
嚣
栈
工
善
;
焉
细
邃
冶
捻
鞠
摔
领
毡
粟
邋
锑
航
济
狐
簇
餐
搅
洋
迈
x
噻
作
惫
萌
G
榴
家
胰
匣
赔
T
蜘
聊
挽
薪
邸
丐
也
溜
膛
淬
憬
液
朱
瞥
徐
顶
肩
吩
瑞
筋
西
钛
拜
站
虾
揍
峭
瞬
9
板
咪
冠
签
存
勿
捆
葡
煎
旦
瘟
锣
斤
三
褒
抉
讳
镀
轿
朽
交
畔
癫
内
栓
蒲
礼
膳
香
古
呎
堆
遍
腭
攘
琢
嘱
爵
抱
径
坛
速
渐
迟
吱
铉
贺
享
肘
氦
槟
翩
焕
肇
闪
遛
疯
坷
素
铛
乱
津
痊
恍
榻
朋
响
范
价
顺
涓
燃
竖
况
释
爹
獭
深
榷
畴
衣
社
龟
雀
灌
骰
颤
瘪
j
燥
牢
娄
球
走
霜
晃
喳
亵
劳
C
喜
恭
众
州
续
钩
牧
衰
际
请
候
字
林
借
斑
萎
锡
碳
躏
常
址
粮
掷
仅
嘟
追
侠
案
栅
汇
竭
凭
确
寐
爪
又
浆
潭
涩
》
鲷
幽
糕
驯
匾
颜
翔
击
斜
硕
肋
考
塌
荡
屏
嘎
袭
枪
汉
德
f
碑
疸
於
拽
伽
刻
伤
潢
从
姿
斓
煌
联
隋
冰
娩
叟
汁
净
嗜
择
逢
文
山
槛
祖
哀
炊
芙
l
狸
杏
胡
涂
卟
瞌
劣
督
务
货
鲁
丹
蚁
杂
渗
厂
晚
扭
鼓
é
噢
琶
鲭
竟
认
漏
胳
敢
啪
栏
冀
宗
朔
怨
录
讫
趟
殆
预
盥
裕
舰
驰
亡
志
鹉
号
岖
拄
o
鱲
飞
湃
厨
郊
啄
弈
R
腊
村
钾
杨
羊
带
人
沼
污
尼
鲜
檀
甸
冈
皮
y
涉
磁
舟
挝
封
特
蜊
溺
眉
瘠
甄
麸
簧
愧
倪
瘩
惕
万
哗
铰
搁
飘
窖
尹
仇
饰
不
绳
篝
助
乌
琥
扬
殴
墅
睽
忙
以
馆
耙
挺
迭
予
惚
幔
服
徽
织
嘻
椹
笔
穆
橄
疮
胧
痤
酪
纤
绪
扮
浮
裁
皆
儒
碇
茎
饺
驱
于
奂
田
铐
雕
疲
趣
账
帑
孩
战
船
檐
沃
垛
写
例
拇
宋
畏
喝
根
势
叠
恕
贱
非
兵
苍
设
恋
缔
臀
讽
喃
态
吞
巩
腱
峦
外
鱿
沫
荃
盒
舶
蛾
钓
浣
吸
殊
容
近
意
踱
袖
情
嶙
讼
哎
统
觎
嘈
缛
松
里
惊
毫
麋
窍
熬
讲
楔
夷
自
十
公
攀
焦
虑
滥
踝
t
嗝
淀
洽
慈
陈
坍
杰
茱
誉
寡
昵
埃
咸
岛
黎
玷
束
荷
樟
胜
强
乓
侃
房
囤
屎
宪
礴
左
N
漆
扣
蝇
蠕
柬
涟
离
轰
体
裹
梯
俗
俚
诋
踢
叙
诀
罗
呵
篱
翘
蘑
禽
咔
谎
的
摇
云
亦
南
凑
匆
揭
矗
袄
农
施
啼
伸
两
给
寿
赛
榔
牦
闲
莫
在
熔
闸
颁
麻
殡
堂
教
笑
)
蓬
鳄
楼
脉
忌
H
藉
棍
犯
约
湾
企
弗
栋
Z
萤
升
底
慢
谴
血
爱
郭
坝
竹
犊
记
董
亏
店
枝
融
泊
级
鬃
需
蕨
锤
犷
醉
笨
0
眼
窒
煽
恙
肝
召
粗
泥
谭
侣
犹
淫
孜
男
酒
霍
被
抹
堤
俸
砷
邦
(
创
笞
茴
棋
担
搬
肠
漓
聪
谟
胞
笼
措
钚
寺
舱
太
丧
境
窜
禧
裘
乒
马
褴
年
冒
睁
侯
柱
床
君
背
蜴
子
畅
懦
籍
澄
唯
萍
狱
凿
]
千
除
蠢
鄂
i
饷
载
瘫
仔
翱
敷
岗
陨
潦
跛
胱
位
纽
裸
p
耘
嗓
园
复
荆
椅
撮
筝
艇
拮
妞
渺
扇
贸
昧
废
捕
贴
缭
妃
哑
铂
簸
处
_
天
导
诸
嬉
婪
赐
谤
批
墩
猫
岔
榄
逻
溴
闻
陵
粱
钦
祥
责
毗
届
噜
使
羡
赖
逼
坎
良
锯
误
碉
菠
抵
列
绷
桌
滨
线
徙
裆
款
睑
上
纪
沾
俭
哪
一
蜱
硼
芬
吴
捞
热
鹈
敦
觉
哩
挛
挪
骷
部
屿
肾
电
砰
迂
涛
蚀
棕
魂
惑
戏
观
判
选
捅
弧
段
蹂
碰
您
维
港
仗
伦
妥
渊
新
租
躁
诲
介
则
拳
劈
磡
蓄
踏
痒
回
测
弥
啸
让
搭
憧
圾
契
谬
躲
)
绌
而
紧
螂
短
诚
囚
鞘
荣
哄
搪
铸
炮
婴
瞻
逸
卫
拥
资
住
视
茶
砍
绊
演
辨
休
班
辛
蒋
问
格
泄
旱
酚
频
螺
撼
勇
鳃
示
波
备
贡
唠
砖
励
揽
纾
洁
典
丁
拯
北
咀
亟
彩
琳
阪
率
壳
障
口
代
诺
褪
域
癣
茨
稳
靛
兔
嗽
折
橱
仆
负
痘
谊
前
赚
奥
罄
琵
桃
唉
壶
全
侮
燕
括
述
英
婆
抑
辩
挠
渎
绚
溯
辽
喘
绍
旗
蟋
浩
赁
番
铠
识
哇
龈
捣
帖
截
没
兴
佼
终
痔
散
撒
诅
蹬
仓
嗅
昆
疙
计
-
标
试
疟
瘸
瞪
原
肽
拔
暑
罚
矩
告
靼
鬼
唬
继
弋
杯
僵
炼
喷
韦
粥
啬
阳
次
喹
胖
力
亚
溉
噪
s
困
材
锈
布
硫
贝
勤
囊
暧
兽
歧
芝
浦
讣
度
凶
刚
但
疗
留
蓉
辆
茜
句
。
旬
珍
虎
疽
系
故
且
蜥
环
膊
娃
蜚
鞭
贻
爆
绉
谓
桶
逮
猥
宵
酩
晶
蔻
堵
泉
四
鹃
籽
御
睾
寻
彰
甘
癌
喂
赎
藕
宣
碱
熄
占
师
椒
夏
苔
腺
怎
挑
森
转
五
暖
绅
玛
毕
暗
矫
粒
骡
组
痉
巾
朵
姑
架
桩
混
恩
糯
修
动
推
剧
伊
埋
霓
讪
汰
切
累
肚
敏
柿
歇
尚
镇
锁
仍
曙
铧
妇
乐
霸
拢
足
烧
遂
瘀
琪
漩
缥
浅
学
舷
仿
榜
早
已
父
损
致
置
骚
辖
译
莹
辑
掠
优
膀
洒
览
桁
媲
,
加
S
具
午
绵
芦
赤
狡
绝
哈
旨
宽
饯
氧
余
哺
吊
挫
首
丢
黏
平
橡
惋
痫
茅
斐
史
荫
舵
翅
打
抽
决
秩
奴
搏
d
缅
拘
灾
姐
淹
贤
静
蝙
壕
佣
茄
樱
寞
锂
综
象
尺
蔬
宁
当
撬
榉
 
瞰
苣
哦
昔
侥
伞
仲
旺
蹭
庄
贞
霆
诞
暮
厥
浴
遵
褛
谨
吮
崽
真
扳
庙
袂
悲
筏
摩
梧
劲
戊
酮
筛
鼹
宜
突
未
刁
衫
铃
探
高
画
弯
柳
坊
益
魄
童
叶
沟
丙
狄
羞
汶
‘
遇
隙
免
寨
厚
呛
她
袋
楞
摧
翰
凛
偏
尧
铁
妙
乏
查
骂
食
防
蕴
晋
檬
梵
躺
央
崇
庇
执
汐
嫩
纶
褥
芽
邪
饿
钱
贯
白
栖
姆
刃
重
叨
耍
饥
知
阿
盲
弩
条
历
贼
快
书
’
勾
杀
阅
难
馅
阱
徘
飓
谦
耆
瞎
有
讶
破
些
氯
承
篷
章
嘲
莺
紫
茉
比
帧
蹈
羽
他
垒
某
促
虐
币
蛋
铀
棵
坡
佬
蟒
盾
羟
庸
巷
金
鼎
赶
乳
娜
娇
催
闷
粹
靖
镰
啦
盛
帕
国
闯
髅
菩
往
毯
瑟
烟
孢
唤
心
烛
裤
独
宴
及
捂
桂
挣
元
+
削
儡
癖
脱
每
依
哭
苜
叔
剔
隘
世
勉
卢
分
似
尽
驻
碧
胭
鸥
漉
急
更
化
@
蚯
项
糙
刨
齿
肟
鞣
亲
包
纺
稿
剂
初
旁
唧
篓
婿
遣
豫
疚
蝴
箔
目
阴
沦
阡
胬
时
归
擦
γ
欣
钳
拌
滑
招
稚
觑
傍
滴
í
受
尔
螨
袍
炽
滓
衅
孽
抢
壁
株
若
能
琴
堪
夭
甩
署
侧
罪
酬
植
糟
卓
毙
盼
咳
氓
保
丽
.
斯
喊
断
茧
7
·
呻
乖
我
皂
忠
涅
辉
凤
拧
辫
垢
拼
毁
穗
方
荧
稣
孔
微
鹳
敲
猛
丛
”
水
肪
俯
腰
苞
旋
铺
期
蒂
梢
面
盔
沸
造
琦
磨
枯
就
梳
郑
远
限
席
钮
绑
辊
慎
榆
憾
即
盗
幸
柄
警
拦
衔
碗
围
哥
搐
该
卜
冕
锅
垦
概
道
峋
衡
眯
费
肯
璃
洼
实
厌
饱
唇
牲
允
夹
蜿
岁
威
n
馨
涎
恿
肛
蚌
库
懂
娴
无
稼
械
貌
榭
孪
坯
坑
壤
桨
耀
湖
恳
篮
冲
B
区
抨
珀
獗
“
誓
慨
肴
缪
缰
蘸
瞄
俄
帐
绣
猾
刍
峰
盐
盈
毋
艾
蝶
呜
奋
烫
F
q
仰
汞
娠
盹
旷
窦
褂
忏
狩
鹦
雹
沓
坪
筑
律
腓
吨
右
值
基
祀
鸽
莉
晰
收
贮
排
莪
名
迫
赃
抗
摄
罢
节
啮
鼾
任
播
梗
吭
蓝
尉
箭
风
孀
垃
垄
仕
呆
辟
晒
蓟
持
砌
廷
付
死
片
删
磺
角
篡
斥
芋
移
熙
M
射
筐
职
懈
虏
旅
喀
疏
磅
靴
广
醺
玲
楠
摒
渣
憋
弛
摆
理
潮
辐
悚
觊
曾
兜
获
雁
鸵
眠
谣
张
兼
炸
伺
胥
葵
涡
忍
唐
庆
唱
柔
婚
窥
稍
筒
病
攻
廖
墟
末
颗
朦
鲸
隐
犁
叼
勘
胚
枭
鲑
辍
皈
轶
添
贿
诉
穷
晨
廓
揉
匈
炭
耻
耐
恒
佩
副
硒
晷
谢
哟
黜
牟

================================================
FILE: translate_duba.py
================================================

from urllib import request
from lxml import etree

class Translate:
    def __init__(self):
        return

    '''获取html'''
    def get_html(self, url):
        headers = {
            'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                          r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
            'Connection': 'keep-alive'
        }
        req = request.Request(url, headers=headers)
        page = request.urlopen(req).read()
        page = page.decode('utf-8')
        return page

    '''解析翻译答案'''
    def extract_answers(self, content):
        selector = etree.HTML(content)
        answer = selector.xpath('//div[@class="in-base"]/div/div/text()')[0]
        return answer

    '''翻译主函数'''
    def translate(self, query):
        url = 'http://www.iciba.com/{}'.format(query)
        html = self.get_html(url)
        try:
            answer = self.extract_answers(html)
        except Exception as e:
            answer = query
        return answer


if __name__ == '__main__':
    handler = Translate()
    while 1:
        query = input('entere an sent to translate:')
        res = handler.translate(query)
        print(res)
Download .txt
gitextract_m2r4jf8s/

├── .idea/
│   ├── misc.xml
│   ├── modules.xml
│   ├── textualEntailenent.iml
│   ├── vcs.xml
│   └── workspace.xml
├── README.md
├── data/
│   └── train.txt
├── lstm_train.py
├── model/
│   └── vocab.txt
└── translate_duba.py
Download .txt
SYMBOL INDEX (17 symbols across 2 files)

FILE: lstm_train.py
  class SiameseNetwork (line 20) | class SiameseNetwork:
    method __init__ (line 21) | def __init__(self):
    method select_best_length (line 44) | def select_best_length(self):
    method build_data (line 78) | def build_data(self):
    method modify_data (line 109) | def modify_data(self):
    method write_file (line 123) | def write_file(self, wordlist, filepath):
    method load_pretrained_embedding (line 128) | def load_pretrained_embedding(self):
    method build_embedding_matrix (line 142) | def build_embedding_matrix(self):
    method create_base_network (line 152) | def create_base_network(self, input_shape):
    method bilstm_siamese_model (line 161) | def bilstm_siamese_model(self):
    method train_model (line 188) | def train_model(self):
    method draw_train (line 203) | def draw_train(self, history):

FILE: translate_duba.py
  class Translate (line 5) | class Translate:
    method __init__ (line 6) | def __init__(self):
    method get_html (line 10) | def get_html(self, url):
    method extract_answers (line 22) | def extract_answers(self, content):
    method translate (line 28) | def translate(self, query):
Condensed preview — 10 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (55K chars).
[
  {
    "path": ".idea/misc.xml",
    "chars": 212,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectRootManager\" version=\"2\" project-"
  },
  {
    "path": ".idea/modules.xml",
    "chars": 288,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n   "
  },
  {
    "path": ".idea/textualEntailenent.iml",
    "chars": 459,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module type=\"PYTHON_MODULE\" version=\"4\">\n  <component name=\"NewModuleRootManager"
  },
  {
    "path": ".idea/vcs.xml",
    "chars": 180,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping dire"
  },
  {
    "path": ".idea/workspace.xml",
    "chars": 12867,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ChangeListManager\">\n    <list default=\"t"
  },
  {
    "path": "README.md",
    "chars": 6305,
    "preview": "# ChineseTextualInference\nChineseTextualInference project including chinese corpus build and inferecence model, 中文文本推断项目"
  },
  {
    "path": "lstm_train.py",
    "chars": 8645,
    "preview": "#!/usr/bin/env python3\n# coding: utf-8\n# File: siamese_train.py\n# Author: lhy<lhy_in_blcu@126.com,https://huangyong.gith"
  },
  {
    "path": "model/vocab.txt",
    "chars": 8055,
    "preview": "编\n念\n恺\n娘\n颈\n悬\n璜\n凄\n垂\n苛\n(\n惜\n橙\n焚\n潘\n蜈\n息\n井\n儿\n顷\n碎\n砸\n奄\n鞋\n辋\n单\n妈\n谱\n蒙\n姬\n斡\n凸\n渡\n撑\n肮\n咖\n缴\n:\n翠\n违\n兆\n晴\n乃\n呕\n懊\n雪\n沐\n趾\nO\n挚\n狈\n葛\n春\n塞\n梁\n坐\n码\n超\n吧\n棘\n"
  },
  {
    "path": "translate_duba.py",
    "chars": 1215,
    "preview": "\nfrom urllib import request\nfrom lxml import etree\n\nclass Translate:\n    def __init__(self):\n        return\n\n    '''获取ht"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the liuhuanyong/ChineseTextualInference GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 10 files (52.1 MB), approximately 18.7k tokens, and a symbol index with 17 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!