【问题标题】:Split sentence into words (with special word list) [duplicate]将句子拆分成单词(带有特殊单词列表)[重复]
【发布时间】:2013-08-10 16:19:16
【问题描述】:

我有一句话:

$text = "word word, dr. word: a.sh. word a.k word?!..";

特殊词是:“博士”。 , "a.sh" 和 "a.k"

这个:

$text = "word word, dr. word: a.sh. word a.k word?!..";
$split = preg_split("/[^\w]([\s]+[^\w]|$)/", $text, -1, PREG_SPLIT_NO_EMPTY);
print_r($split);

正则表达式给了我这个:

 Array (   
     [0] => word   
     [1] => word  
     [2] => dr  
     [3] => word    
     [4] => a.sh   
     [5] => word   
     [6] => a.k   
     [7] => word     ) 

我需要

数组(
[0] => 单词
[1] => 单词
[2] => 博士。 # 单词
[4] => a.sh。 # 单词
[6] => a.k
[7] => 单词)

【问题讨论】:

标签: php regex text-segmentation


【解决方案1】:

我认为你是在倒退。与其尝试定义不是单词的正则表达式,不如定义什么是单词,并捕获所有匹配的字符序列。

$special_words = array("dr.", "a.sh.", "a.k");
array_walk($special_words, function(&$item, $key){ $item= preg_quote($item, '~');});

$regex = '~(?<!\w)(' . implode('|', $special_words) . '|\w+)(?!\w)~';
$str = 'word word, dr. word: a.sh. word a.k word?!..';
preg_match_all($regex, $str, $matches);
var_dump($matches[0]);

这里的键是特殊词数组、array_walk 和正则表达式。

array_walk

这一行,就在您的数组定义之后,遍历您的每个特殊单词并转义所有 REGEX 特殊字符(如 .?),包括我们稍后将使用的分隔符。这样,您可以定义任何您喜欢的词,而不必担心它会如何影响正则表达式。

正则表达式。

Regex 实际上非常简单。使用| 作为胶水将特殊词插入,然后添加另一个管道和您的标准词定义(我选择w+,因为它对我来说最有意义。)用括号包围那个巨大的交替来分组它,我添加了向后看和向前看,以确保我们不会从单词中间偷窃。因为正则表达式从左到右工作,a.sh. 中的 a 不会被拆分成自己的单词,因为 a.sh. 特殊单词会捕获它。除非它显示a.sh.e,在这种情况下,三部分表达式的每个部分都将匹配为三个单独的单词。

Check it out.

【讨论】:

  • 有效!感谢你!可以加快这段代码的速度吗?我会检查你的代码。再次感谢你
  • @Guno 加快速度?你的特殊词列表有多长?你的弦有多长?如果其中任何一个都太长了,您可能希望研究词法分析器而不是家庭纺正则表达式解决方案。事实上,它的运行时间不到十分之一秒。
  • 单词列表不会很长,但我会多次调用这个函数。不幸的是,当文本是格鲁吉亚语(utf-8 unicode)时,这不起作用
  • 没有理由不能。如果您的文本将使用 unicode,看在上帝的份上,请在您的原始问题中提及这一点。如果您将u 修饰符添加到表达式的末尾,并适当地设置您的语言环境,您就可以使其工作。
  • 例如:这里是Giberrish in the Cyrillic Character set。我会用实际的格鲁吉亚胡言乱语来做,但我找不到格鲁吉亚 Lorem Ipsum 生成器。对不起。
猜你喜欢
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多