解析文本文档的最佳方法

7
我想尝试在PHP中解析纯文本文档,但不知道如何正确地做到这一点。我想分离每个单词,为它们分配一个ID,并以JSON格式保存结果。
示例文本:
"Hello, how are you (today)"

我目前正在做的事情:

$document_array  = explode(' ', $document_text);
json_encode($document_array);

生成的 JSON 如下:

[["Hello,"],["how"],["are"],["you"],["(today)"]]

如何确保空格保持原样,且符号不会与单词混合在一起...
[["Hello"],[", "],["how"],[" "],["are"],[" "],["you"],["  ("],["today"],[")"]]

我相信需要使用某种正则表达式,但不知道应该应用什么样的模式来处理所有情况... 有什么建议吗?

2个回答

4
这实际上是一个非常复杂的问题,也是学术研究的重点之一。听起来很简单(只需按空格拆分!可能还需要一些标点符号的规则...),但你很快就会遇到问题。 "didn't" 是一个词还是两个词?连字符连接的单词呢?有些可能是一个单词,有些可能是两个单词。连续多个标点符号怎么办?所有格与引号的区别?等等等等。甚至确定句子的结尾也是不容易的。(难道它不就是一个句号吗?!)
这个问题涉及到分词,是搜索引擎非常重视的一个主题。说实话,你应该真正考虑在你选择的语言中找到一个分词器。

是的,第三方解决方案可能是最好的选择...我相信他们多年来已经建立了相当复杂的规则来处理这些问题。有什么建议吗? - Eric Franklin
1
在 PHP 中没有。在 Java 中有一些:Open NLP、Stanford NLP、Lucene 的分词器以及 Python 中的 NLTK。 - Richard H
Python是另一种基于Web的编程语言...我以前没有使用过,但我想我可以用Python实现解析器,然后将JSON发送回PHP...不知道怎么做。 - Eric Franklin

2
也许是这个吗?
array_filter(preg_split('/\b/', $document_text))

'array_filter'函数可以移除结果数组中第一个和/或最后一个索引处的空值,如果你的字符串以单词边界(\b)开头或结尾,则会出现这种情况。详见:http://php.net/manual/en/regexp.reference.escape.php


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接