1

我有一个字符串列表(论坛上的主题),例如:

"[John Smith] Hello my friend 1080p"
"It was him! by Ronnie"
"new: Hello, my friend, J. Smith"
"Askade la bonko"
...
"Smith John: Hello my friend! (super mega must see!)"
"Alibaba won that game by John Smith"

我需要过滤相同的内容主题。从这个列表中,我可以看到 1,3(标题中有逗号)和 pre-last(标题中有 !)主题具有相同的内容,但标题略有不同(“你好,我的朋友”)。

有什么算法可以过滤这些吗?我的意思是我只想在我的字符串列表中有一个“你好,我的朋友”。谢谢指教!

4

3 回答 3

3

一个常用的模型是词袋模型。其中一个常用的距离度量是余弦相似度

你有一个实词列表。您可能希望包含诸如“Hello”和“friend”之类的内容,但不包含诸如“by”和“and”之类的内容。

您可能还想转换您的输入词,例如您可能不想区分大小写,理想情况下您可能想去掉语法变形。所以你想要这样的东西:

>>> content_words( "Smith John: Hello my friend (super mega must see!)" )
[ "smith", "john", "hello", "friend", "super", "mega", "must" ]

另一个答案对如何做到这一点有很好的建议。

每个主题行在概念上映射到一个高维向量,每个内容词对应一个维度。该模型有两个细微的变化(如果有任何显着差异,您可以查看哪一个最适合您的数据):

  • 如果单词出现,则元素的条目为 1,如果不出现,则为 0
  • 向量在一个维度上的值是对应单词出现的次数

两个条目的余弦相似度是向量的点积除以向量范数的乘积。

正如您可能看到的那样,您实际上不需要在内存中构建那些巨大的向量(它们很稀疏——大多数条目将为零)。知道内容词的总数以及它们中的哪些出现在相关条目中就足够了。

于 2013-06-20T09:49:59.213 回答
1

我会选择StemmingLemmatisation文本处理框架NTLK中有一些强大的实现

于 2013-06-20T09:40:08.507 回答
0

你基本上是在寻找两个句子的相似性,成对的。有不同的方法来衡量两个句子的相似度。

使用一袋词模型,您可以去应用聚类算法,如k-Nearest-Neighbourk-Means等。

我希望这能给你一些启发

于 2013-06-20T09:51:51.173 回答