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

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第三方库


热门话题
Grails2.1.0/Java7在Windows8.1上从何处获取当前用户名?   JavaSpringJMSActiveMQ   java异常处理,捕获导致while循环停止   sql server 2008将日期时间解析为JAVA日期   java是第一个servlet,但无法打开它   如何在Java中使用XML bean创建典型的XML头?   java将iOs应用程序转换为Android   java将jsp页面内容读取到其他jsp页面中的html   客户端计算机中小型数据库应用程序的java实现   java同步和ServletContextListener   安卓 Java将所有转义字符替换为双转义   当我在布局单元中实现ScrollView时,java GridView的setOnItemLongClickListener不起作用(使用适配器)   禁用Java web服务端点Wsdl   java如何编写一个程序来反转用户输入的数字