目前我正在开发一个Web应用程序来获取Twitter流并试图通过我自己创建一个自然语言处理。
由于我的数据来自Twitter(限制为140个字符),因此缩短了许多单词,或者在这种情况下,省略了空格。
例如:
"Hi, my name is Bob. I m 19yo and 170cm tall"
应该被标记为:
- hi
- my
- name
- bob
- i
- 19
- yo
- 170
- cm
- tall
请注意19
中的yo
和19yo
之间有无空格。我主要用它来提取单位数。
简单地说,我需要的是一种“爆炸”每个令牌的方法,其中包含大量数字或字母没有分隔符。
'123abc'
将为['123', 'abc']
'abc123'
将为['abc', '123']
'abc123xyz'
将为['abc', '123', 'xyz']
等等。
在PHP中实现它的最佳方法是什么?
我找到了接近它的东西,但它是C#,特别是日/月分裂。 How do I split a string in C# based on letters and numbers
答案 0 :(得分:7)
您可以使用preg_split
$string = "Hi, my name is Bob. I m 19yo and 170cm tall";
$parts = preg_split("/(,?\s+)|((?<=[a-z])(?=\d))|((?<=\d)(?=[a-z]))/i", $string);
var_dump ($parts);
当匹配数字字母边界时,正则表达式匹配必须为零宽度。角色本身不得包含在比赛中。为此,zero-width lookarounds很有用。
答案 1 :(得分:1)
怎么样:
通过使用正则表达式从字符串中提取数字,将它们存储在数组中,用一些特殊字符替换字符串中的数字,这将“保持”它们的位置。解析仅由您的特殊字符和普通字符创建的字符串后,您将把数字从数组提供给他们保留的地方。
只是一个想法,但imho可能适合你。编辑: 尝试运行这个简短的代码,希望你会在输出中看到我的观点。 (这段代码在键盘上不起作用,不知道为什么)
<?php
$str = "Hi, my name is Bob. I m 19yo and 170cm tall";
preg_match_all("#\d+#", $str, $matches);
$str = preg_replace("!\d+!", "#SPEC#", $str);
print_r($matches[0]);
print $str;