C# 正则表达式从tweet中提取单词、名称、hashtag和短语
我正在使用twitter提要整理各种tweet中的单词、名称、标签和短语 我假设名字是几个以大写字母开头的单词,hashtag后面是除空格以外的所有单词,短语是引号中的东西,单词是单词 这也将是很好的拔出任何链接太多,但这是没有必要的 我想使用正则表达式,但如果有更好的解决方案,我想知道 推特帖子示例: 你知道,当你看到韦斯·安德森的新预告片时,你会看很多电影,然后想,“等等,Futura字体在哪里?” 将拆分Wes Anderson,C# 正则表达式从tweet中提取单词、名称、hashtag和短语,c#,regex,C#,Regex,我正在使用twitter提要整理各种tweet中的单词、名称、标签和短语 我假设名字是几个以大写字母开头的单词,hashtag后面是除空格以外的所有单词,短语是引号中的东西,单词是单词 这也将是很好的拔出任何链接太多,但这是没有必要的 我想使用正则表达式,但如果有更好的解决方案,我想知道 推特帖子示例: 你知道,当你看到韦斯·安德森的新预告片时,你会看很多电影,然后想,“等等,Futura字体在哪里?” 将拆分Wes Anderson,等等,Futura字体在哪里?,#MoviesILike,以
等等,Futura字体在哪里?
,#MoviesILike
,以及所有的单词
我现在玩的正则表达式是:
Regex _wordRegex = new Regex(@"(?:\""(?<Item>.*?)\"")|(?<Item>(?:[A-Z][a-z]*?[.\s])+)|(?<Item>#\S+)|(?<Item>\w+)");
Regex\u wordRegex=newregex(@“(?:\”(?.*?))(?(?:[A-Z][A-Z]*?[.\s])+)(?\s+)(?\w+);
我已经处理了我的推特数据。我发现最好的方法是用空格标记消息字符串,然后分析每个标记。这很有效。。。让我们看看这些案例:
@bobjones let's go watch the game at @hooters #nfl #broncos #tebow
对于@
和#
标记,只需检查第一个字符。对于URL,您可能需要在那里使用正则表达式。所以基本上:
if token[0] == '@' then mention
else if token[0] == '#' then hashtag
else if token looks like a url then url
else then word
在我看来,在这种情况下,没有必要把正则表达式的事情复杂化。特别是因为您希望从同一字符串中提取不同类型的内容
你在引用中提到的东西。。。您可能希望将其作为标记化中的一个特例来处理。我发现,上面关于通过空格标记字符串并遍历标记以查找哈希标记的答案只有在您没有标点符号或其他奇怪的字符紧靠哈希标记的情况下才能准确地工作。例如,
I like#programming
可以成功标记化,但是I like#programming,对吗?
将导致错误识别的标签:#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!
}
string raw=“你好,这真是太棒了,对吧?”;
列表hashtags=新列表();
StringBuilder sb=null;
foreach(raw.ToLower()中的字符c)
{
如果(c='#')
{
sb=新的StringBuilder();
轨迹=真;
}
else if(轨道)
{
if(字符Isleterordigit(c))
{
sb.附加(c);
}
其他的
{
Add(sb.ToString());
轨迹=假;
}
}
}
如果(轨道)
{
hashtags.Add(sb.ToString());//确保抓取最后一个!
}
它去除了散列符号(这很好,这样你就不会得到“或”什么),但你应该得到
太棒了,是的
如果您发布一些有用的推特提要示例。@保罗-对不起,我假设每个人都熟悉推特帖子。CodeInChaos-为答案添加了我的一个尝试!我认为一个标记器有点过分了。这是一个来自twitter数据的简单Word云应用程序。如果其他一切都失败了,那将是我的核心选择:)+1对空格的刻划远没有regex过分,IMO:)@orangeoctopus Plus,它的好处是可读性更强,不那么脆弱!耶!