6

目前我正在开发一个 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# 并且特别适用于日/月拆分。如何在 C# 中根据字母和数字拆分字符串

4

2 回答 2

9

您可以使用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);

匹配数字字母边界时,正则表达式匹配必须是零宽度。字符本身不得包含在匹配中。为此,零宽度环视很有用。

http://codepad.org/i4Y6r6VS

于 2012-04-16T19:59:58.373 回答
1

这个怎么样:

您使用正则表达式从字符串中提取数字,将它们存储在数组中,用某种特殊字符替换字符串中的数字,这将“保持”它们的位置。在解析仅由您的特殊字符和普通字符创建的字符串后,您会将数组中的数字输入到他们的保留位置。

只是一个想法,但恕我直言可能对你有用。

编辑:尝试运行这个短代码,希望你能在输出中看到我的观点。(此代码在键盘上不起作用,不知道为什么)

<?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;
于 2012-04-16T20:08:50.360 回答