2011-09-30 89 views
2

我想从PHP正则表达式中提取专有名词(例如Micheal Jackson),但是我的正则表达式不正确。php/regex - 从文本中提取专有名词

文本:

我的朋友迈克尔杰克逊是流行音乐之王。游戏专辑卖得很少。

我想要什么:

一个正则表达式是能够提取的多个单词e.g迈克尔杰克逊还是游戏专辑专有名词。

我的正则表达式:

/(?<=\s)([A-Z][a-z]+).*(?=\s)/ 

感谢。

P.S.通过移动设备发布。道歉,如果格式不好。

+0

正则表达式不知道正确的名称是什么。你如何定义/发现它们? – sln

+0

Michael。以防拼写对你的算法很重要。 – TARKUS

回答

3

尝试使用单词边界,而不是你的回顾后/超前

/\b([A-Z][a-z]+)\b/ 

我不明白你.*部分,这将在第一个字到最后空格后搭配什么,所以我从我的正则表达式删除了。

如果你想一次匹配多个字(也许你对自己.*实现这一目标?)试试这个:

(?:\s*\b([A-Z][a-z]+)\b)+ 

看到它here on Regexr

+2

+1(':\ s * \ b([A-Z] [a-z] +)\ b)+'正则表达式。那些在一个单词中间有大写字母的专有名词(例如,像CompuServe这样的公司名称)呢?也许你应该考虑使用'(?:\ s * \ b([A-Z] [A-Za-z] +)\ b)+'代替。 – megaflop

+0

对于像“iPhone”这样以小写字母开头,但有大写字母的专有名词,我使用:(?:\ s * \ b([az] * [AZ] [A-Za-z] +)\ b)+ –

+0

仅供参考:这将匹配单个大写单词前的空格前面的空格。 – aikramer2

1

斯坦福分析器可以帮助你在这里。它将标记你的短语,并根据句子结构提取专有名词和所有其他作品。

它可以作为一个jar下载,或者你可以尝试一下在网上浏览:http://nlp.stanford.edu:8080/parser/