6

現在、Twitterストリームを取得するWebアプリケーションを開発しており、自然言語処理を自分で作成しようとしています。

私のデータは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

これはどう:

正規表現を使用して文字列から数値を抽出し、それらを配列に格納し、文字列内の数値をある種の特殊文字に置き換えます。これにより、その位置が「保持」されます。特別な文字と通常の文字によってのみ作成された文字列を解析した後、配列から予約された場所に数値をフィードします。

ただのアイデアですが、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;
于 2012-04-16T20:08:50.360 に答える