正则表达式,用于从推文中提取单词、名称、标签和短语



我正在使用twitter提要来整理各种推文中的单词、名称、标签和短语。

我假设名字是几个以大写字母开头的单词,标签后面是#,除了空格之外,其他都是,短语是引号里的东西,单词就是单词。

拉出任何链接也很好,但这不是必要的。

我想使用Regex,但如果有更好的解决方案,我想知道。

推特帖子示例:

你知道,当你看到韦斯·安德森的新预告片时,你会想,"等等,Futura字体在哪里?"#MoviesLikehttp://bit.ly/HklUk

将拆分Wes AndersonWait, where's the Futura font?#MoviesILike和所有单词

我现在玩的Regex是:

Regex _wordRegex = new Regex(@"(?:""(?<Item>.*?)"")|(?<Item>(?:[A-Z][a-z]*?[.s])+)|(?<Item>#S+)|(?<Item>w+)");

我已经处理了相当多的twitter数据。我发现最好的方法是用空格标记消息字符串,然后分析每个标记。这个效果很好。。。让我们看看案例:

@bobjones let's go watch the game at @hooters #nfl #broncos #tebow

对于@#标记,您只需要检查第一个字符。对于URL,您可能希望在那里使用regex。所以基本上:

if token[0] == '@' then mention
else if token[0] == '#' then hashtag
else if token looks like a url then url
else then word

在我看来,在这种情况下,不需要使用regex来使事情复杂化。特别是因为您希望从同一字符串中提取不同类型的内容。

你引用了一些话。。。您可能希望将其作为标记化中的一个角落案例来处理。

我发现,只有在没有标点符号或其他奇怪字符紧靠标签的情况下,上面关于通过空格标记字符串并在标记中迭代寻找标签的答案才能准确工作。例如,I like #programming可以成功地标记化,但I like #programming, right?将导致错误识别的标签:#programming,

有几种方法可以解决这个问题。我建议采用一种迭代方法,依次查看每个字符。它会更慢,但更准确。

string raw = "hello this is #Totally #Awesome, right? #yeah!";
List<string> hashtags = new List<string>();
StringBuilder sb = null;
foreach (char c in raw.ToLower())
{
    if (c == '#')
    {
        sb = new StringBuilder();
        track = true;
    }
    else if (track)
    {
        if (char.IsLetterOrDigit(c))
        {
            sb.Append(c);
        }
        else
        {
            hashtags.Add(sb.ToString());
            track = false;
        }
    }
}
if (track)
{
    hashtags.Add(sb.ToString());  // Make sure to grab the last one!
}

它去掉了散列符号(这很好,所以你不会得到#######或其他什么),但你应该得到

非常棒,是的

最新更新