Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:regexp语句切分_Python_Regex - Fatal编程技术网

Python:regexp语句切分

Python:regexp语句切分,python,regex,Python,Regex,在下面的代码中,有一个简单的标记器,可以很好地用于我需要显示它的测试文件: import re, sys for line in sys.stdin: for token in re.findall("(\w+\.\w+\.[\w.]*|\w+[-.]\w+|[-]+|'s|[,;:.!?\"%']|\w+)", line.strip()): print(token) 像这样的文字房子很小。那房子很大。正确转到: This house is small . That h

在下面的代码中,有一个简单的标记器,可以很好地用于我需要显示它的测试文件:

import re, sys
for line in sys.stdin:
    for token in re.findall("(\w+\.\w+\.[\w.]*|\w+[-.]\w+|[-]+|'s|[,;:.!?\"%']|\w+)", line.strip()):
        print(token)
像这样的文字房子很小。那房子很大。正确转到:

This
house
is
small
.
That
house
is
big
.
但是,我还需要在句子之间插入一个空行:

···
small
.

That
···
所以我写了另一个循环

for token in re.sub("([\"\.!?])\s([\"`]+|[A-Z]+\w*)", "\\1\n\n\\2", line):

使用一个
regexp
,它捕获了我需要使用的测试文本中几乎所有的分句,但是我在实际连接到代码时遇到了麻烦。将它放在我觉得最符合逻辑的第一个
for循环中,会完全破坏输出。还尝试了一些
if子句,但也不起作用。

这里有一个更简单的方法,适用于您给出的示例。如果需要更复杂的正则表达式,可以将其添加回:

import re
mystr = "This house is small. That house is big."
for token in re.findall(r"([\w]+|[^\s])", mystr):
    print (token)
    if re.match(r"[.!?]", token):
        print()

我不太清楚您希望如何处理句子中的标点符号,以及哪个标点符号终止了一个句子,因此可能需要稍加修改。

这里有一个更简单的方法,适用于您给出的示例。如果需要更复杂的正则表达式,可以将其添加回:

import re
mystr = "This house is small. That house is big."
for token in re.findall(r"([\w]+|[^\s])", mystr):
    print (token)
    if re.match(r"[.!?]", token):
        print()

我不太清楚您希望如何处理句子中的标点符号,以及哪个标点符号终止了一个句子,因此它可能需要稍微修改。

非正则表达式解决方案使用和from
nltk

from nltk.tokenize import word_tokenize, sent_tokenize

s = "This house is small. That house is big."

for t in sent_tokenize(s):
    for word in word_tokenize(t):
        print(word)
    print
印刷品:

This
house
is
small
.

That
house
is
big
.

结合使用和from
nltk
的非正则表达式解决方案:

from nltk.tokenize import word_tokenize, sent_tokenize

s = "This house is small. That house is big."

for t in sent_tokenize(s):
    for word in word_tokenize(t):
        print(word)
    print
印刷品:

This
house
is
small
.

That
house
is
big
.
是一个开源的句子切分器,在正式的商务英语句子(WSJ文章)上具有最先进的表现。它使用简单的正则表达式作为初始过滤器,然后使用单层感知器处理剩余10%的困难情况。因此,它可以被训练在《华尔街日报》英语以外的领域表现出色

句子边界检测(和分割)是一个积极研究和不断完善的领域。我认为没有一个正则表达式可以可靠地检测句子和句子边界。此外,正则表达式不能很容易地告诉您它们在句子边界中有多“自信”。而且他们不能接受新词汇、语言、方言或写作风格的再培训。我能想到的一些例子会破坏许多正则表达式:

  • 是HMTL吗?(拼写?)标记语言
  • 这个呢。。。HTML可以进一步标记
  • 要点句有时不以任何特殊标点符号结尾
  • 引用“这是一个句子吗?”
  • 椭圆(“…”)
  • 具有特殊含义的Unicode问号和句号
  • 人群一遍又一遍地高呼“U.S.A.U.S.A.”
这甚至没有开始涉及各种非正式的英语或外语语法,如克里奥尔语、聊天信息、城市俚语等

英语(或任何自然语言)是一种经验定义的语言(或“历史定义的”),其中语法和标点符号规则取决于人类进行交流的经验。而这种体验历史的“时间窗”是可以根据语境、地理位置、甚至是关于受众/读者的个人“心理理论”进行调整的。甚至孩子们在很小的时候也会发展自己的“秘密”语言。人类根据在特定领域、地理区域等与之交流的人来制定、打破和进化语言规则

因此,句子切分准确度的最新水平也必须是“模糊”的,并且在您的领域(来自“您的世界”的一组培训示例)内根据经验定义(例如机器学习)如果准确性对你很重要。

是一个开源的句子切分器,在正式的商务英语句子(WSJ文章)上有着最先进的表现。它使用简单的正则表达式作为初始过滤器,然后使用单层感知器处理剩余10%的困难情况。因此,它可以被训练在《华尔街日报》英语以外的领域表现出色

句子边界检测(和分割)是一个积极研究和不断完善的领域。我认为没有一个正则表达式可以可靠地检测句子和句子边界。此外,正则表达式不能很容易地告诉您它们在句子边界中有多“自信”。而且他们不能接受新词汇、语言、方言或写作风格的再培训。我能想到的一些例子会破坏许多正则表达式:

  • 是HMTL吗?(拼写?)标记语言
  • 这个呢。。。HTML可以进一步标记
  • 要点句有时不以任何特殊标点符号结尾
  • 引用“这是一个句子吗?”
  • 椭圆(“…”)
  • 具有特殊含义的Unicode问号和句号
  • 人群一遍又一遍地高呼“U.S.A.U.S.A.”
这甚至没有开始涉及各种非正式的英语或外语语法,如克里奥尔语、聊天信息、城市俚语等

英语(或任何自然语言)是一种经验定义的语言(或“历史定义的”),其中语法和标点符号规则取决于人类进行交流的经验。而这种体验历史的“时间窗”是可以根据语境、地理位置、甚至是关于受众/读者的个人“心理理论”进行调整的。甚至孩子们在很小的时候也会发展自己的“秘密”语言。人类根据在特定领域、地理区域等与之交流的人来制定、打破和进化语言规则


因此,如果准确度对您很重要,那么句子切分的准确度也必须是“模糊”的,并且在您的领域(一组来自“您的世界”的培训示例)内根据经验定义(例如机器学习)。

效果很好,谢谢!令人惊讶的是,当在o面前