把一个德国化合物分成身体和头部

char-split的Python项目详细描述


基于CharSplit的德语复合拆分器ngram

把一个德国化合物分成身体和头部

Autobahnraststätte -> Autobahn - Raststätte

本论文附录所述方法的实施:

Tuggener,Don(2016年)。德语的增量共指解析。苏黎世大学文学院。在

TL;DR

该方法计算ngram在单词开头、结尾和中间出现的概率,并确定最有可能发生拆分的位置。在

该方法对Germanet compound test set上的头部检测精度达到95%。在

提供了一个模型,训练了100万。来自维基百科的德语名词。在

用法

训练新型号:

$ python char_split_train.py <your_train_file>

其中<your_train_file>每行包含一个单词(名词)。在

复合分裂

从命令行:

^{pr2}$

输出所有可能的拆分,按分数排序,例如

$ python char_split.py Autobahnraststätte
0.84096566854	Autobahn	Raststätte
-0.54568851959	Auto	Bahnraststätte
-0.719082070993	Autobahnrast	Stätte
...

作为一个模块:

$ python
>>> import char_split
>>> char_split.split_compound('Autobahnraststätte')
[[0.7945872450631273, 'Autobahn', 'Raststätte'],
 [-0.7143290887876655, 'Auto', 'Bahnraststätte'],  
 [-1.1132332878581173, 'Autobahnrast', 'Stätte'],  
 [-1.4010051533086552, 'Aut', 'Obahnraststätte'],  
 [-2.3447843979244944, 'Autobahnrasts', 'Tätte'],  
 [-2.4761904761904763, 'Autobahnra', 'Ststätte'],  
 [-2.4761904761904763, 'Autobahnr', 'Aststätte'],  
 [-2.5733333333333333, 'Autob', 'Ahnraststätte'],  
 [-2.604651162790698, 'Autobahnras', 'Tstätte'],  
 [-2.7142857142857144, 'Autobah', 'Nraststätte'],  
 [-2.730248306997743, 'Autobahnrastst', 'Ätte'],  
 [-2.8033113109925973, 'Autobahnraststä', 'Tte'],  
 [-3.0, 'Autoba', 'Hnraststätte']]

文档拆分

从命令行:

$ python doc_split.py <dict>

从标准输入读取所有内容 写出来一样,用最好的分割 由中间点字符·分隔。在

每一个单词都被拆分成尽可能多的次数 在包含德语单词的文件<;dict> 每行一个(允许以#开头的注释行)。在

默认字典的名称在文件doc_config.py中。在

注意,doc_split模块保留了一个已经拆分的字的缓存, 因此,长文档的处理速度通常会相应加快 比短的。 当程序结束时,缓存被丢弃。在

$ python sentence1.txt
Um die in jeder Hinsicht zufriedenzustellen, tüftelt er einen Weg aus,
sinnlose Bürokratie wie Ladenschlußgesetz und Nachtbackverbot auszutricksen.  
$ python doc_split.py <sentence1.txt  
Um die in jeder Hinsicht zufriedenzustellen, tüftelt er einen Weg aus,
sinnlose Bürokratie wie Laden·schluß·gesetz und Nacht·back·verbot auszutricksen.  

作为一个模块:

$ python
>>> import doc_split
>>> # Constant containing a middle dot
>>> doc_split.MIDDLE_DOT
'·'
>>> # Split a word as much as possible, return a list
>>> doc_split.maximal_split('Verfassungsschutzpräsident')
['Verfassungs', 'Schutz', 'Präsident']
>>> # Split a word as much as possible, return a word with middle dots
'Verfassungs·schutz·präsident'
>>> # Split all splittable words in a sentence
>>> doc_split.doc_split('Der Marquis schlug mit dem Handteller auf sein Regiepult.')
Der Marquis schlug mit dem Hand·teller auf sein Regie·pult.

文档拆分服务器

由于启动时间的原因,您可以运行文档拆分器 作为一个简单的服务器,响应会更快。在

$ python doc_server [ -d ] <dict> <port>

服务器将加载<dict>并监听<port>。 客户必须 将UTF-8编码的原始数据发送到端口 关闭端口的写端,然后 服务器将返回分割数据。在

选项-d使服务器返回已排序的字典 而不是分裂的词。每个单词都在一行上, 原始单词后跟制表符,然后是拆分单词。在

由于Python的限制,服务器是单线程的。在

默认字典和端口在文件doc_config.py中。在

提供了一个普通客户端:

$ python doc_client <port> <host>

从标准输入中读取文档, 将其发送到运行在<host><port>上的服务器, 并将服务器的输出发送到标准输出。 因此它具有与doc_split相同的接口 (除非无法指定字典), 但应该跑得快一点。在

默认主机和端口在文件doc_config.py中。在

下载词典

要下载doc_splitdoc_server的德语和荷兰语词典:

$ cd dicts
$ sh getdicts

这将从LibreOffice网站下载拼写插件, 提取单词表,并将五个文件写入当前目录。 它在/tmp中留下了很多文件,这些文件不再需要了。在

  • 字典de-DE.dicde-AT.dic和{}是 相当广泛(每个25万字) 并提供当前德语、奥地利语和瑞士语拼写。在
  • 文件de-1901.dic提供了1901年至1996年期间使用的拼写。在
  • 文件misc.dic是一个名词的集合,这些名词被错误地拆分并 因此,它们被包括在词典中,这样它们就不会被分开了。在
  • 文件legal.dic包含法律术语。运行前将其拆下 如果你不想把它包括在内的话,就去做。在
  • 文件de-mixed.dic是所有其他文件的合并。在
  • 文件nl-NL.dic来自OpenOffice,提供荷兰语拼写 (当前未使用)。在

如果需要,可以在运行getdicts之前添加自己的单词表。 它们必须是纯UTF-8文本,每行一个单词 从正确的语言开始通用电气代码(de表示德语)。在

如果程序的拆分不够困难, 你可能想找到并使用一个较小的字典。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
使用applets查询的多人java游戏?   java如何基于字符串生成数组   基于java多边形的路径查找   java如何对多列ArrayList排序   java批处理更新从更新中返回了意外的行数(Spring/Hibernate)   java如何使用SeleniumWebDriver列出<tr>标记内的所有<td>   java如何使用SimpleFlatMapper将前缀为CSV的列别名到映射?   java为什么通过eclipse运行/调试TomCat时会出现ClassNotFoundException   java Android滚动视图上次视图未显示内部线性布局   替换字符串中不带空格的字符序列   调用方法时Java Swing GUI冻结   java是否允许/建议重用收集器?   在同步方法中使用java hashmap迭代器时   在java XMLDecoder XMLEncoder中写入XMLdatabase   java I无法在活动的片段中填充recyclerview   java Jitsi在调用过程中播放WAV文件如果可能,与音频混合   java JPA为什么我看到DB中每行有两个实体实例?